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("添加成功!");
}
可以簡單的分析一下執行的過程:
- ExecuteNonQuery()方法根據參數不同将會首先重載#1-1,
//#1-1public static int ExecuteNonQuery(string connectionString, CommandType commandType,
string commandText){}
- 在#1-1中設定參數數組為null,既
SqlHelper.ExecuteNonQuery(SqlHelper.connectionString, CommandType.Text, sql,
(SqlParameter[])null)。
- 這時候ExecuteNonQuery()方法根據參數不同将會首先重載#1-2,
//#1-2public static int ExecuteNonQuery(string connectionString, CommandType commandType, string commandText,
params SqlParameter[] commandParameters){}
- 在#1-2中重載#2-2方法執行查詢。
//#2-2
public static int ExecuteNonQuery(SqlConnection connection, CommandType commandType,
string commandText, params SqlParameter[] commandParameters){}
- 在#2-2中首先要使用私有的PrepareCommand()方法把參數放入SqlCommand中,然後執行ADO.Net的ExecuteNonQuery()方法(這個是無參數的原始方法),執行成功則傳回整數1。
- 剩下的就是一些判斷和輸出的過程了。
也可以自己寫一些别的方法驗證其他重載方法的時候,在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("執行無參數存儲過程成功");
}
其他方法都是類似的,這個類中我們常用的方法如下:
- ExecuteNonQuery(): 執行簡單的無傳回值的查詢。
- ExecuteDataset(): 傳回Dataset的查詢,相當于傳回一個數組。
- ExecuteReader(): 使用DataReader讀取資料。(注:少量資料的情況下使用SqlDataReader的效率高于使用Dataset)
- 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。