SqlHelper是一個基於.NET Framework的數據庫操作組件。組件中包含數據庫操作方法。SqlHelper用於簡化你重復的去寫那些數據庫連接(SqlConnection),SqlCommand,SqlDataReader等等。SqlHelper 封裝過后通常是只需要給方法傳入一些參數如數據庫連接字符串,SQL參數等,就可以訪問數據庫了,很方便。
sqlhelper是C#中abstract抽象類的典型應用
簡介
SqlHelper是一個基於.NET Framework的數據庫操作組件。組件中包含數據庫操作方法,SqlHelper有很多版本,主要以微軟一開始發布的SqlHelper類,后面包含進了Enterprise Library開源包中了。還有一個主要版本是
dbhelper
.org開源的sqlhelper組件,優點是簡潔,高性能,不僅僅支持sqlserver,同時支持sqlserver、oracle、access、Mysql數據庫,也是一個開源項目,提供免費下載。
SqlHelper用於簡化你重復的去寫那些數據庫連接(SqlConnection),SqlCommand,
SqlDataReader等等。SqlHelper 封裝過后通常是只需要給方法傳入一些參數如數據庫連接字符串,SQL參數等,就可以訪問數據庫了,很方便。
SqlHelper 類用於通過一組
靜態方法來封裝數據訪問功能。該類不能被繼承或實例化,因此將其聲明為包含專用
構造函數的不可繼承類。在 SqlHelper 類中實現的每種方法都提供了一組一致的
重載。這提供了一種很好的使用 SqlHelper 類來執行命令的模式,同時為開發人員選擇訪問數據的方式提供了必要的靈活性。每種方法的重載都支持不同的方法參數,因此開發人員可以確定傳遞連接、
事務和參數信息的方式。
在應用SqlHelper前最好使用web.config配置連接字符串,這樣有利於網站的可移植性和代碼的簡潔。
<connectionStrings> <!--SqlServerHelper連接字符串設定--> <add connectionString="server=.;uid=sa;pwd=123456;database=yourdatabase" name="SqlServerHelper"/> <!--Oracle連接字符串設定--> <add connectionString="Data Source=orcl;User Id=system;Password=***;Integrated Security=no" name="OracleHelper"/> <!--MySql連接字符串設定--> <add connectionString="server=localhost;uid=root;pwd=123456;database=mysqldatabase" name="MySqlHelper"/> </connectionStrings> <!--access連接字符串設定--> <add connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=F:\mdbFilePath\db.mdb;Jet OLEDB:Database Password=123" name="MySqlHelper"/> </connectionStrings>

<appSettings> <add key="" value=""> </appSettings>
編寫SqlHelper調用代碼:
SqlHelper支持多種數據庫包括MySql、SqlServer、Oracle、Access數據庫,如果數據庫是SqlServer,那么你可以使用SqlServerHelper類,如果是MySql,可以使用MySqlHelper,如果是Access,可以使用AccessHelper。如果是Oracle則可以使用OracleHelper類。
SqlHelper的書寫風格很多,你可以選擇自己的需求和愛好使用靜態方式或對象方式。各種利弊。選擇情況使用吧!
靜態方式
靜態方式也是目前應用最多的一種,因為其簡單,所以在寫一個Sql語句時,用一個方法就可以搞定。如果一個過程需要多個Sql語句執行時,得創建SqlConnection和控制他的傳參,使語句復雜。或者就是每執行一個sql語句讓SqlConnection創建一次,使性能受到影響。但是在只執行一個簡單的查詢語句時,顯的更簡單,所以這種方式在簡單的執行邏輯面前,受到大家的喜愛!
//查詢語句執行: DataTable dt=SqlServerHelper.ReadTable("select * from table1"); //插入語句執行: SqlServerHelper.ExecuteNonQuery("insert into [students] values(@student_name,@class“), SqlServerHelper.CreateInputParameter("@student_name", SqlDbType.NVarChar, 100, txt_student_name_sqlserver.Text), SqlServerHelper.CreateInputParameter("@class", SqlDbType.NVarChar, 100, txt_class_sqlserver.Text) );
對象式編程
其實這種語法也不復雜,只是加個using語句而己:

1 using (SqlServerHelper helper = new SqlServerHelper()) 2 { 3 helper.Command.CommandText = "delete from [Students] where stid=@stid"; 4 helper.AddParameter("@stid", SqlDbType. Int, student_id); 5 helper.Open(); 6 helper.ExecuteNoneQuery(); 7 helper.Command.Parameters.Clear(); 8 helper.Command.CommandText = "select * from [Students]";return helper.ReadTable(); 9 }
這是官方示例代碼中的一部分,語法簡單,在一個using語句中執行了delete刪除語句和select查語句。
比如,如果你想執行
事務時,可以使用:

1 using (SqlServerHelper helper = new SqlServerHelper()) 2 { 3 helper.Command.CommandText = "delete from [Students] where stid=@stid"; 4 helper.AddParameter("@stid", SqlDbType. Int, student_id); 5 helper.Open(); 6 DbTransaction tran = helper.Connection.BeginTransaction(); 7 helper.Command.Transaction=tran; 8 try 9 { 10 helper.ExecuteNoneQuery(); 11 tran.Rollback(); 12 } 13 catch { tran.Rollback(); throw; } 14 }
在 SqlHelper 類中實現的方法包括:
ExecuteNonQuery。此方法用於執行不返回任何行或值的命令。這些命令通常用於執行數據庫更新,但也可用於返回
存儲過程的輸出參數。
ExecuteReader。此方法用於返回
SqlDataReader對象,該對象包含由某一命令返回的
結果集。
ExecuteDataset。此方法返回
DataSet對象,該對象包含由某一命令返回的結果集。
ExecuteScalar。此方法返回一個值。該值始終是該命令返回的第一行的第一列。
ExecuteXmlReader。此方法返回 FOR XML 查詢的 XML 片段。
除了這些公共方法外,SqlHelper 類還包含一些專用函數,用於管理參數和准備要執行的命令。不管客戶端調用什么樣的方法實現,所有命令都通過 SqlCommand 對象來執行。在 SqlCommand 對象能夠被執行之前,所有參數都必須添加到 Parameters 集合中,並且必須正確設置 Connection、CommandType、CommandText 和 Transaction 屬性。SqlHelper 類中的專用函數主要用於提供一種一致的方式,以便向 SQL Server 數據庫發出命令,而不考慮客戶端應用程序調用的
重載方法實現。SqlHelper 類中的專用實用程序函數包括:
AttachParameters:該函數用於將所有必要的 SqlParameter 對象連接到正在運行的 SqlCommand。
AssignParameterValues:該函數用於為 SqlParameter 對象賦值。
PrepareCommand:該函數用於對命令的屬性(如連接、事務環境等)進行初始化。
ExecuteReader:此專用 ExecuteReader 實現用於通過適當的 CommandBehavior 打開
SqlDataReader對象,以便最有效地管理與
閱讀器關聯的連接的有效期。
注意
1、如果使用SqlHelper方法調用數據庫
存儲過程,需要獲取存儲過程的返回值,請使用帶有SqlParameter[]參數的方法,Object[]參數的方法無法獲取存儲過程返回值
源程序

1 (中文注釋) 2 /// <summary> 3 /// 自定義訪問通用類 4 /// </summary> 5 public class SqlDbHelper 6 { 7 string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["conn"].ConnectionString; 8 /// <summary> 9 ///構造函數 10 /// </summary> 11 public SqlDbHelper() 12 { 13 } 14 /// <summary> 15 /// ExecuteNonQuery操作,對數據庫進行 增、刪、改 操作((1) 16 /// </summary> 17 /// <param name="sql">要執行的SQL語句 </param> 18 /// <returns> </returns> 19 public int ExecuteNonQuery(string sql) 20 { 21 return ExecuteNonQuery(sql, CommandType.Text, null); 22 } 23 /// <summary> 24 /// ExecuteNonQuery操作,對數據庫進行 增、刪、改 操作(2) 25 /// </summary> 26 /// <param name="commandType">要執行的查詢類型(存儲過程、SQL文本) </param> 27 /// <returns> </returns> 28 public int ExecuteNonQuery(string sql, CommandType commandType) 29 { 30 return ExecuteNonQuery(sql, commandType, null); 31 } 32 /// <summary> 33 /// ExecuteNonQuery操作,對數據庫進行 增、刪、改 操作(3) 34 /// </summary> 35 /// <param name="parameters">參數數組 </param> 36 /// <returns> </returns> 37 public int ExecuteNonQuery(string sql, CommandType commandType,params SqlParameter[] parameters) 38 { 39 int count = 0; 40 { 41 using (SqlCommand command = new SqlCommand(sql, connection)) 42 { 43 command.CommandType = commandType; 44 if (parameters != null) 45 { 46 foreach (SqlParameter parameter in parameters) 47 { 48 command.Parameters.Add(parameter); 49 } 50 } 51 connection.Open(); 52 count = command.ExecuteNonQuery(); 53 } 54 } 55 return count; 56 } 57 /// <summary> 58 /// SqlDataAdapter的Fill方法查詢,並返回一個DataSet類型結果(1) 59 /// </summary> 60 /// <returns> </returns> 61 { 62 return ExecuteDataSet(sql, CommandType.Text, null); 63 } 64 /// <summary> 65 /// SqlDataAdapter的Fill 方法 執行一 查詢,並返回一個DataSet類型結果(2) 66 /// </summary> 67 /// <returns> </returns> 68 { 69 return ExecuteDataSet(sql, commandType, null); 70 } 71 /// <summary> 72 /// SqlDataAdapter的Fill方法執行查詢,並返回一個DataSet類型結果(3) 73 /// </summary> 74 /// <returns> </returns> 75 public DataSet ExecuteDataSet(string sql, CommandType commandType, SqlParameter[] parameters) 76 { 77 DataSet ds = new DataSet(); 78 { 79 using (SqlCommand command = new SqlCommand(sql, connection)) 80 { 81 command.CommandType = commandType; 82 if (parameters != null) 83 { 84 foreach (SqlParameter parameter in parameters) 85 { 86 command.Parameters.Add(parameter); 87 } 88 } 89 SqlDataAdapter adapter = new SqlDataAdapter(command); 90 adapter.Fill(ds); 91 } 92 } 93 return ds; 94 } 95 /// <summary> 96 /// SqlDataAdapter的Fill方法執行個查詢,並返回一個DataTable類型結果(1) 97 /// </summary> 98 /// <returns> </returns> 99 public DataTable ExecuteDataTable(string sql) 100 { 101 return ExecuteDataTable(sql, CommandType.Text, null); 102 } 103 /// <summary> 104 /// SqlDataAdapter的Fil執行一個查詢,並返回一個DataTable類型結果(2) 105 /// </summary> 106 /// <returns> </returns> 107 public DataTable ExecuteDataTable (string sql, CommandType commandType) 108 { 109 return ExecuteDataTable(sql, commandType, null); 110 } 111 /// <summary> 112 /// SqlDataAdapter的Fill方法,執行一個查詢,並返回一個DataTable類型結果(3) 113 /// </summary> 114 /// <returns> </returns> 115 public DataTable ExecuteDataTable(string sql, CommandType commandType, SqlParameter[] parameters) 116 { 117 DataTable data = new DataTable(); 118 using (SqlConnection connection = new SqlConnection(connectionString)) 119 { 120 using (SqlCommand command = new SqlCommand(sql, connection)) 121 { 122 command.CommandType = commandType; 123 if (parameters != null) 124 { 125 foreach (SqlParameter parameter in parameters) 126 { 127 command.Parameters.Add(parameter); 128 } 129 } 130 adapter.Fill(data); 131 } 132 } 133 return data; 134 } 135 /// <summary> 136 /// ExecuteReader執行一查詢,返回一SqlDataReader對象實例(1) 137 /// </summary> 138 /// <returns> </returns> 139 public SqlDataReaderExecuteReader (string sql) 140 { 141 return ExecuteReader(sql, CommandType.Text, null); 142 } 143 /// <summary> 144 /// ExecuteReader執行一查詢,返回一SqlDataReader對象實例(2) 145 /// </summary> 146 /// <returns> </returns> 147 publicSqlDataReader ExecuteReader(string sql, CommandType commandType) 148 { 149 return ExecuteReader(sql, commandType, null); 150 } 151 /// <summary> 152 /// ExecuteReader執行一查詢,返回一SqlDataReader對象實例(3) 153 /// </summary> 154 /// <returns> </returns> 155 publicSqlDataReader ExecuteReader( string sql, CommandType commandType, SqlParameter[] parameters) 156 { 157 SqlConnection connection = new SqlConnection(connectionString); 158 SqlCommand command = new SqlCommand(sql, connection); 159 command.CommandType = commandType; 160 if (parameters != null) 161 { 162 foreach (SqlParameter parameter in parameters) 163 { 164 command.Parameters.Add(parameter); 165 } 166 } 167 connection.Open(); 168 return command.ExecuteReader(CommandBehavior.CloseConnection); 169 } 170 /// <summary> 171 /// ExecuteScalar執行一查詢,返回查詢結果的第一行第一列(1) 172 /// </summary> 173 /// <returns> </returns> 174 public Object ExecuteScalar(string sql) 175 { 176 return ExecuteScalar(sql, CommandType.Text, null); 177 } 178 /// <summary> 179 /// ExecuteScalar執行一查詢,返回查詢結果的第一行第一列(2) 180 /// </summary> 181 /// <returns> </returns> 182 public Object ExecuteScalar( string sql, CommandType commandType) 183 { 184 return ExecuteScalar(sql, commandType, null); 185 } 186 /// <summary> 187 /// ExecuteScalar執行一查詢,返回查詢結果的第一行第一列(3) 188 /// </summary> 189 /// <returns> </returns> 190 { 191 object result = null; 192 { 193 using (SqlCommand command = new SqlCommand(sql, connection)) 194 { 195 command.CommandType = commandType; 196 if (parameters != null) 197 { 198 foreach (SqlParameter parameter in parameters) 199 { 200 command.Parameters.Add(parameter); 201 } 202 } 203 connection.Open(); 204 result = command.ExecuteScalar(); 205 } 206 } 207 return result; 208 } 209 /// <summary> 210 /// 返回當前連接的數據庫中所有由用戶創建的數據庫 211 /// </summary> 212 /// <returns> </returns> 213 public DataTable GetTables() 214 { 215 DataTable data = null; 216 { 217 connection.Open(); 218 data = connection.GetSchema("Tables"); 219 } 220 return data; 221 } 222 }