天天看點

微軟SqlHelper類中文注釋和使用方法

SqlHelper.cs是N年前微軟出品的一個使用ADO.Net方法對SQL Server資料庫進行操作的封裝類,随後有高人根據這個類寫了DbHelper.cs以操作SQL Server之外的資料庫,而後微軟也釋出了Enterprise Library企業庫元件。但是對于剛開始學習ADO.Net/C#或者中小企業應用層面來說,根據SqlHelper.cs類做簡單的資料庫通路層的東西已經足夠用了。Enterprise Library企業庫雖然十分的強大,但是入手和配置都不是那麼簡單,殺雞完全不用宰牛刀。

其實這個很古老的類還有一個很值得學習的地方:C#中重載的使用。每個查詢資料庫的方法都有8個左右的重載方法,對C#面向對象思想中的多态性不了解的,看過這些個重載方法基本上都會清清楚楚了。此外應該注意的是public sealed class SqlHelper{}:sealed修飾符修飾的類是封閉的類,是不能被繼承的。

和微軟釋出的SqlHelper.cs不同,為了友善我把裡面的SqlHelperParameterCatch.cs單獨列出來了。下面的下載下傳中還有OledbHelper.cs、OdbcHelper.cs和XMLHelper.cs可供使用,分别針對不同的資料庫類型。下面略微解析一下SqlHelper.cs這個類的使用方法,其中類内部使用的私有方法不再介紹,因為公共方法的使用大同小異,是以就以最簡單的ExecuteNonQuery()方法作為範例。

ASP.NET/C#語言:

下述代碼是ExecuteNonQuery()的9個重載方法。

前3個算是準備查詢

//#1-1
public static int ExecuteNonQuery(string connectionString, CommandType commandType, string commandText){}
//#1-2
public static int ExecuteNonQuery(string connectionString, CommandType commandType, string commandText, 
params SqlParameter[] commandParameters){}
//#1-3
public static int ExecuteNonQuery(string connectionString, string spName, params object[] parameterValues){}      

中間3個是執行查詢。

//#2-1
public static int ExecuteNonQuery(SqlConnection connection, CommandType commandType, string commandText){}
//#2-2
public static int ExecuteNonQuery(SqlConnection connection, CommandType commandType, string commandText,
 params SqlParameter[] commandParameters){}
//#2-3
public static int ExecuteNonQuery(SqlConnection connection, string spName, params object[] parameterValues){}      

後面3個則是用于SQL事物查詢。

//#3-1
public static int ExecuteNonQuery(SqlTransaction transaction, CommandType commandType, string commandText){}
//#3-2
public static int ExecuteNonQuery(SqlTransaction transaction, CommandType commandType, string commandText,
 params SqlParameter[] commandParameters){}
//#3-3
public static int ExecuteNonQuery(SqlTransaction transaction, string spName, params object[] parameterValues){}      

再細分,

//#2-1public static int ExecuteNonQuery(SqlConnection connection, CommandType commandType,
 string commandText){}      

執行的是無參數的SQL語句,而

//#2-2public static int ExecuteNonQuery(SqlConnection connection, CommandType commandType, 
string commandText, params SqlParameter[] commandParameters){}      

執行的是包含參數數組的SQL語句(參數數組可以為空)。

//#2-3
public static int ExecuteNonQuery(SqlConnection connection, string spName, 
params object[] parameterValues){}      

執行的則是無傳回值的存儲過程。

實際上,#1-1和#1-3

//#1-1public static int ExecuteNonQuery(string connectionString, CommandType commandType,
 string commandText){}
 
//#1-3
public static int ExecuteNonQuery(string connectionString, string spName,
 params object[] parameterValues){}      

重載是為了友善無參數的SQL語句。

而#1-3和#2-3

//#1-3public static int ExecuteNonQuery(string connectionString, string spName, 
params object[] parameterValues){}      
//#2-3
public static int ExecuteNonQuery(SqlConnection connection, string spName, 
params object[] parameterValues){}      

重載隻是為了友善調用存儲過程,他們的本質還是和#1-2和#2-2

//#1-2public static int ExecuteNonQuery(string connectionString, CommandType commandType,
 string commandText, 
params SqlParameter[] commandParameters){}      
//#2-2
public static int ExecuteNonQuery(SqlConnection connection, CommandType commandType, 
string commandText,
 params SqlParameter[] commandParameters){}      

一樣。下面是針對重載方法的一些簡單使用。

1. ExecuteNonQuery()執行無參數的SQL語句。

ASP.NET/C#語言:

string sql = "INSERT INTO Customer(Country,Firstname,Lastname) VALUES('USA','Steven','Sun')";if (SqlHelper.ExecuteNonQuery(SqlHelper.connectionString, CommandType.Text, sql) == 1)
{
    Response.Write("添加成功!");
}      

可以簡單的分析一下執行的過程:

  1. ExecuteNonQuery()方法根據參數不同将會首先重載#1-1,
//#1-1public static int ExecuteNonQuery(string connectionString, CommandType commandType,
 string commandText){}      
  1. 在#1-1中設定參數數組為null,既
SqlHelper.ExecuteNonQuery(SqlHelper.connectionString, CommandType.Text, sql,      
(SqlParameter[])null)。      
  1. 這時候ExecuteNonQuery()方法根據參數不同将會首先重載#1-2,
//#1-2public static int ExecuteNonQuery(string connectionString, CommandType commandType, string commandText, 
params SqlParameter[] commandParameters){}      
  1. 在#1-2中重載#2-2方法執行查詢。
//#2-2
public static int ExecuteNonQuery(SqlConnection connection, CommandType commandType, 
string commandText, params SqlParameter[] commandParameters){}      
  1. 在#2-2中首先要使用私有的PrepareCommand()方法把參數放入SqlCommand中,然後執行ADO.Net的ExecuteNonQuery()方法(這個是無參數的原始方法),執行成功則傳回整數1。
  2. 剩下的就是一些判斷和輸出的過程了。

也可以自己寫一些别的方法驗證其他重載方法的時候,在Visual Studio中按F11可以逐語句的檢視執行的過程,下面兩個方法的使用也是一樣的,是以就隻貼代碼了。

2. ExecuteNonQuery()執行有參數數組的SQL語句。

ASP.NET/C#語言:

//修改指定CustomerId的顧客的國籍string sql = "UPDATE Customer SET Country=@Country WHERE CustomerId=@CustomerId";
SqlParameter[] param = new SqlParameter[]
{
    new SqlParameter("@Version", SqlDbType.VarChar),
    new SqlParameter("@CustomerId", SqlDbType.Int)
};
param[0].Value = "England";
param[1].Value = 5;
if (SqlHelper.ExecuteNonQuery(SqlHelper.connectionString, CommandType.Text, sql, param) == 1)
{
    Response.Write("修改成功!");
}      

SQL Server語言:

CREATE PROCEDURE [dbo].[SP_ExecuteNonQuery]AS
BEGIN
INSERT INTO Customer VALUES('Japan','Beautiful','Girl')
END      

ASP.NET/C#語言:

if (SqlHelper.ExecuteNonQuery(SqlHelper.connectionString, "SP_ExecuteNonQuery") == 1){
     Response.Write("執行無參數存儲過程成功");
}      

其他方法都是類似的,這個類中我們常用的方法如下:

  1. ExecuteNonQuery(): 執行簡單的無傳回值的查詢。
  2. ExecuteDataset(): 傳回Dataset的查詢,相當于傳回一個數組。
  3. ExecuteReader(): 使用DataReader讀取資料。(注:少量資料的情況下使用SqlDataReader的效率高于使用Dataset)
  4. ExecuteScalar(): 傳回結果集中的第一行第一列,相當于傳回單個值。

其他的方法使用的較少,就不介紹了。強烈建議使用Visual Studio 2010調試這些程式,下面是這幾個類的下載下傳位址,如有問題,歡迎和我一起探讨。

其他的方法使用的較少,就不介紹了。強烈建議使用​​Visual Studio 2010​​調試這些程式,下面是這幾個類的下載下傳位址,如有問題,歡迎和我一起探讨。

1. SqlHelper.cs詳細中文注釋:​​http://www.feiyan.info/upload/SqlHelper.cs.pdf​​。

2. SqlHelper類庫:​​http://www.feiyan.info/upload/SqlHelper.rar​​。