本文為七小站主原創作品,轉載請註明出處:http://www.cnblogs.com/qixiaoyizhan/ ...
ORM框架想必大家都比較熟知了,即對象關係映射(英語:Object Relation Mapping,簡稱ORM,或O/RM,或O/R mapping),是一種程式技術,用於實現面向對象編程語言里不同類型系統的數據之間的轉換。從效果上說,它其實是創建了一個可在編程語言里使用的“虛擬對象資料庫”。 當你開發一個應用程式的時候(不使用O/R MAPPING),你可能會寫不少數據訪問層的代碼,用來從資料庫保存,刪除,讀取對象信息,等等。
現在流行的ORM框架有: JAVA系列:APACHE OJB,CAYENNE,JAXOR,JPA,HIBERNATE,IBATIS/MYBATIS,JRELATIONALFRAMEWORK,SMYLE,TOPLINK等 其中 TOPLINK 是 ORACLE 的商業產品,其他均為開源項目。其中 HIBERNATE的輕量級 ORM 模型逐步確立了在 JAVA ORM 架構中領導地位,甚至取代複雜而又繁瑣的 EJB 模型而成為事實上的 JAVA ORM 工業標準。 .NET系列:EF(ENTITY FRAMWORK),NHIBERNATE,Ibits,ENTITYSCODEGENERATE,LINQ TOSQL,GROVE,RUNGOO.ENTERPRISEORM,FIRECODE CREATOR,MYGENERATION,CODESMITH PRO,CODEAUTO等 微軟VS中自帶的有EF(ENTITY FRAMWORK)框架。你在DAL中寫了很多的方法來讀取對象數據,改變狀態對象等等任務。而這些代碼寫起來總是重覆的。我們可不可以寫一個類來封裝這些重覆的勞動呢?
想必大家都有曾經想過寫SqlHelper吧,實際上,從SqlHelper一步步寫下來,封裝到足夠好之後,就會成為一個自己專屬的ORM框架了。
在這裡,小編寫了一個很基礎的類ORM的SqlHelper裡面僅僅對Select查詢語句進行了封裝,由於考慮到了反射機制的詬病(這裡不再討論,關於反射效率問題有大多數的討論,利與弊總是同時存在的,我們不糾結於這點)。對於常見的CRUD來說,CUD通常一個方法可以實現,並且Sql語句可以得到更大的封裝結合配置文件和反射機制進行操作。小編這裡採用的模式是SqlServer+SqlHelper+代碼生成器(需要代碼生成器的可以聯繫本人,不定期更新)來完成的代碼編寫工作,因此沒有對CUD進行大量的封裝,同時也提高了執行效率(你懂的)。
接下來我貼上我的代碼(裡面註釋採用中文註釋,比較完善有不懂的可以咨詢本人):
1 public static readonly string ConnString = ConfigurationManager.ConnectionStrings["ConStr"].ConnectionString;
這裡的讀取資料庫連接字元串採用在配置文件中讀取的方式,需要在配置文件中進行配置一個連接名稱為"ConStr"的連接字元串。如下Appconfig.XML:(這裡配置為本機)
1 <connectionStrings> 2 <add name="ConStr" connectionString="Data Source=.;Initial Catalog=db_Test;Integrated Security=True"/> 3 </connectionStrings>
內部的一些主要方法介紹:
ExecuteNonQuery 執行sql命令,返回受影響的行數。 一般用作CUD操作
ExecuteScalar 執行sql語句或存儲過程 返回ExecuteScalar (返回自增的ID)不帶參數
ExecuteReader 執行sql語句或存儲過程 返回DataReader
ExecuteDataSet 執行sql語句或存儲過程,返回DataSet
public static List<T> ReturnListByModels<T>(DataSet ds) 反射返回一個List T 類型的結果集 如List<User> 用於Reader操作
public static T ReturnModelByModels<T>(SqlDataReader reader) 反射返回一個T類型的結果 如User 用於Reader操作
SqlHelper_DG代碼如下:
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Configuration; 5 using System.Data; 6 using System.Data.SqlClient; 7 using System.Reflection; 8 9 10 namespace SqlHelper_Framework4_5_DG 11 { 12 /// <summary> 13 /// SqlHelper 14 /// 此類為抽象類,不允許實例化,在應用時直接調用即可; 15 /// author qixiao(DG); 16 /// release Time :20160506; 17 /// </summary> 18 public abstract class SqlHelper_DG 19 { 20 #region ConStr鏈接字元串---ConStr鏈接字元串聲明 21 /// <summary> 22 /// 連接字元串 ConnString 公共靜態只讀 不允許進行修改 在後續調用中目前不支持代碼修改鏈接字元串--DG 23 /// </summary> 24 public static readonly string ConnString = ConfigurationManager.ConnectionStrings["ConStr"].ConnectionString; 25 #endregion 26 27 #region ExcuteNonQuery 執行sql語句或者存儲過程,返回影響的行數---ExcuteNonQuery 28 /// <summary> 29 /// 執行sql語句或存儲過程,返回受影響的行數,不帶參數。--DG 30 /// </summary> 31 /// <param name="ConnString">連接字元串,可以自定義,可以使用SqlHelper_DG.ConnString</param> 32 /// <param name="commandTextOrSpName">sql語句或存儲過程名稱</param> 33 /// <param name="commandType">命令類型 有預設值CommandType.Text</param> 34 /// <returns>返回受影響的行數</returns> 35 public static int ExecuteNonQuery(string ConnString, string commandTextOrSpName, CommandType commandType = CommandType.Text) 36 { 37 try 38 { 39 using (SqlConnection conn = new SqlConnection(ConnString)) 40 { 41 using (SqlCommand cmd = new SqlCommand()) 42 { 43 PreparCommand(conn, cmd, commandTextOrSpName, commandType);//參數增加了commandType 可以自己編輯執行方式 44 return cmd.ExecuteNonQuery(); 45 } 46 } 47 } 48 catch (Exception) 49 { 50 return default(int); 51 } 52 } 53 /// <summary> 54 /// 執行sql語句或存儲過程,返回受影響的行數。--DG 55 /// </summary> 56 /// <param name="ConnString">連接字元串,可以自定義,可以使用SqlHelper_DG.ConnString</param> 57 /// <param name="commandTextOrSpName">sql語句或存儲過程名稱</param> 58 /// <param name="commandType">命令類型 t</param> 59 /// <param name="parms">SqlParameter[]參數數組,允許空</param> 60 /// <returns>返回受影響的行數</returns> 61 public static int ExecuteNonQuery(string ConnString, string commandTextOrSpName, CommandType commandType, params SqlParameter[] parms) 62 { 63 try 64 { 65 using (SqlConnection conn = new SqlConnection(ConnString)) 66 { 67 using (SqlCommand cmd = new SqlCommand()) 68 { 69 PreparCommand(conn, cmd, commandTextOrSpName, commandType, parms);//參數增加了commandType 可以自己編輯執行方式 70 return cmd.ExecuteNonQuery(); 71 } 72 } 73 } 74 catch (Exception) 75 { 76 return default(int); 77 } 78 79 80 } 81 /// <summary> 82 /// 執行sql命令,返回受影響的行數。--DG 83 /// </summary> 84 /// <param name="ConnString">連接字元串,可以自定義,可以以使用SqlHelper_DG.ConnString</param> 85 /// <param name="commandTextOrSpName">sql語句或存儲過程名稱</param> 86 /// <param name="commandType">命令類型</param> 87 /// <param name="obj">object[]參數數組,允許空</param> 88 /// <returns>返回受影響的行數</returns> 89 public static int ExecuteNonQuery(string ConnString, string commandTextOrSpName, CommandType commandType, params object[] obj) 90 { 91 try 92 { 93 using (SqlConnection conn = new SqlConnection(ConnString)) 94 { 95 using (SqlCommand cmd = new SqlCommand()) 96 { 97 PreparCommand(conn, cmd, commandTextOrSpName, commandType, obj);//參數增加了commandType 可以自己編輯執行方式 98 return cmd.ExecuteNonQuery(); 99 } 100 } 101 } 102 catch (Exception) 103 { 104 return default(int); 105 } 106 107 108 } 109 #endregion 110 111 #region ExecuteScalar 執行sql語句或者存儲過程,執行單條語句,返回自增的id---ScalarExecuteScalar 112 /// <summary> 113 /// 執行sql語句或存儲過程 返回ExecuteScalar (返回自增的ID)不帶參數--DG 114 /// </summary> 115 /// <param name="ConnString">連接字元串,可以自定義,可以使用SqlHelper_DG.ConnString</param> 116 /// <param name="commandTextOrSpName">sql語句或存儲過程名稱</param> 117 /// <param name="commandType">命令類型 有預設值CommandType.Text</param> 118 /// <returns></returns> 119 public static object ExecuteScalar(string ConnString, string commandTextOrSpName, CommandType commandType = CommandType.Text) 120 { 121 try 122 { 123 using (SqlConnection conn = new SqlConnection(ConnString)) 124 { 125 using (SqlCommand cmd = new SqlCommand()) 126 { 127 PreparCommand(conn, cmd, commandTextOrSpName, commandType); 128 return cmd.ExecuteScalar(); 129 } 130 131 } 132 } 133 catch (Exception) 134 { 135 return default(int); 136 } 137 } 138 /// <summary> 139 /// 執行sql語句或存儲過程 返回ExecuteScalar (返回自增的ID)--DG 140 /// </summary> 141 /// <param name="ConnString">連接字元串,可以自定義,可以使用SqlHelper_DG.ConnString</param> 142 /// <param name="commandTextOrSpName">sql語句或存儲過程名稱</param> 143 /// <param name="commandType">命令類型</param> 144 /// <param name="parms">SqlParameter[]參數數組,允許空</param> 145 /// <returns></returns> 146 public static object ExecuteScalar(string ConnString, string commandTextOrSpName, CommandType commandType, params SqlParameter[] parms) 147 { 148 try 149 { 150 using (SqlConnection conn = new SqlConnection(ConnString)) 151 { 152 using (SqlCommand cmd = new SqlCommand()) 153 { 154 PreparCommand(conn, cmd, commandTextOrSpName, commandType, parms); 155 return cmd.ExecuteScalar(); 156 } 157 158 } 159 } 160 catch (Exception) 161 { 162 return default(int); 163 } 164 } 165 /// <summary> 166 /// 執行sql語句或存儲過程 返回ExecuteScalar (返回自增的ID)--DG 167 /// </summary> 168 /// <param name="ConnString">連接字元串,可以自定義,可以使用SqlHelper_DG.ConnString</param> 169 /// <param name="commandTextOrSpName">sql語句或存儲過程名稱</param> 170 /// <param name="commandType">命令類型</param> 171 /// <param name="obj">object[]參數數組,允許空</param> 172 /// <returns></returns> 173 public static object ExecuteScalar(string ConnString, string commandTextOrSpName, CommandType commandType, params object[] obj) 174 { 175 try 176 { 177 using (SqlConnection conn = new SqlConnection(ConnString)) 178 { 179 using (SqlCommand cmd = new SqlCommand()) 180 { 181 PreparCommand(conn, cmd, commandTextOrSpName, commandType, obj); 182 return cmd.ExecuteScalar(); 183 } 184 } 185 } 186 catch (Exception) 187 { 188 189 return default(int); 190 } 191 } 192 #endregion 193 194 #region ExecuteReader 執行sql語句或者存儲過程,返回DataReader---DaataReader 195 /// <summary> 196 /// 執行sql語句或存儲過程 返回DataReader 不帶參數--DG 197 /// </summary> 198 /// <param name="ConnString">連接字元串,可以自定義,可以使用SqlHelper_DG.ConnString</param> 199 /// <param name="commandTextOrSpName">sql語句或存儲過程名稱</param> 200 /// <param name="commandType">命令類型 有預設值CommandType.Text</param> 201 /// <returns></returns> 202 public static SqlDataReader ExecuteReader(string ConnString, string commandTextOrSpName, CommandType commandType = CommandType.Text) 203 { 204 //sqlDataReader不能用using 會關閉conn 導致不能獲取到返回值。註意:DataReader獲取值時必須保持連接狀態 205 try 206 { 207 SqlConnection conn = new SqlConnection(ConnString); 208 SqlCommand cmd = new SqlCommand(); 209 PreparCommand(conn, cmd, commandTextOrSpName, commandType); 210 return cmd.ExecuteReader(CommandBehavior.CloseConnection); 211 } 212 catch (Exception) 213 { 214 return null; 215 } 216 } 217 /// <summary> 218 /// 執行sql語句或存儲過程 返回DataReader--DG 219 /// </summary> 220 /// <param name="ConnString">連接字元串,可以自定義,可以使用SqlHelper_DG.ConnString</param> 221 /// <param name="commandTextOrSpName">sql語句或存儲過程名稱</param> 222 /// <param name="commandType">命令類型</param> 223 /// <param name="parms">SqlParameter[]參數數組,允許空</param> 224 /// <returns></returns> 225 public static SqlDataReader ExecuteReader(string ConnString, string commandTextOrSpName, CommandType commandType, params SqlParameter[] parms) 226 { 227 //sqlDataReader不能用using 會關閉conn 導致不能獲取到返回值。註意:DataReader獲取值時必須保持連接狀態 228 try 229 { 230 SqlConnection conn = new SqlConnection(ConnString); 231 SqlCommand cmd = new SqlCommand(); 232 PreparCommand(conn, cmd, commandTextOrSpName, commandType, parms); 233 return cmd.ExecuteReader(CommandBehavior.CloseConnection); 234 } 235 catch (Exception) 236 { 237 return null; 238 } 239 } 240 /// <summary> 241 /// 執行sql語句或存儲過程 返回DataReader--DG 242 /// </summary> 243 /// <param name="ConnString">連接字元串,可以自定義,可以使用SqlHelper_DG.ConnString</param> 244 /// <param name="commandTextOrSpName">sql語句或存儲過程名稱</param> 245 /// <param name="commandType">命令類型</param> 246 /// <param name="obj">object[]參數數組,允許空</param> 247 /// <returns></returns> 248 public static SqlDataReader ExecuteReader(string ConnString, string commandTextOrSpName, CommandType commandType, params object[] obj) 249 { 250 //sqlDataReader不能用using 會關閉conn 導致不能獲取到返回值。註意:DataReader獲取值時必須保持連接狀態 251 try 252 { 253 SqlConnection conn = new SqlConnection(ConnString); 254 SqlCommand cmd = new SqlCommand(); 255 PreparCommand(conn, cmd, commandTextOrSpName, commandType, obj); 256 return cmd.ExecuteReader(CommandBehavior.CloseConnection); 257 } 258 catch (Exception) 259 { 260 return null; 261 } 262 } 263 #endregion 264 265 #region ExecuteDataset 執行sql語句或者存儲過程,返回一個DataSet---DataSet 266 /// <summary> 267 /// 執行sql語句或存儲過程,返回DataSet 不帶參數--DG 268 /// </summary> 269 /// <param name="ConnString">連接字元串,可以自定義,可以使用SqlHelper_DG.ConnString</param> 270 /// <param name="commandTextOrSpName">sql語句或存儲過程名稱</param> 271 /// <param name="commandType">命令類型 有預設值CommandType.Text</param> 272 /// <returns></returns> 273 public static DataSet ExecuteDataSet(string ConnString, string commandTextOrSpName, CommandType commandType = CommandType.Text) 274 { 275 try 276 { 277 using (SqlConnection conn = new SqlConnection(ConnString)) 278 { 279 using (SqlCommand cmd = new SqlCommand()) 280 { 281 PreparCommand(conn, cmd, commandTextOrSpName, commandType); 282 using (SqlDataAdapter da = new SqlDataAdapter(cmd)) 283 { 284 DataSet ds = new DataSet(); 285 da.Fill(ds); 286 return ds; 287 } 288 } 289 } 290 } 291 catch (Exception) 292 { 293 return null; 294 } 295 } 296 /// <summary> 297 /// 執行sql語句或存儲過程,返回DataSet--DG 298 /// </summary> 299 /// <param name="ConnString">連接字元串,可以自定義,可以使用SqlHelper_DG.ConnString</param> 300 /// <param name="commandTextOrSpName">sql語句或存儲過程名稱</param> 301 /// <param name="commandType">命令類型</param> 302 /// <param name="parms">SqlParameter[]參數數組,允許空</param> 303 /// <returns></returns> 304 public static DataSet ExecuteDataSet(string ConnString, string commandTextOrSpName, CommandType commandType, params SqlParameter[] parms) 305 { 306 try 307 { 308 using (SqlConnection conn = new SqlConnection(ConnString)) 309 { 310 using (SqlCommand cmd = new SqlCommand()) 311 { 312 PreparCommand(conn, cmd, commandTextOrSpName, commandType, parms); 313 using (SqlDataAdapter da = new SqlDataAdapter(cmd)) 314 { 315 DataSet ds = new DataSet(); 316 da.Fill(ds); 317 return ds; 318 } 319 } 320 } 321 } 322 catch (Exception) 323 { 324 return null; 325 } 326 } 327 /// <summary> 328 /// 執行sql語句或存儲過程,返回DataSet--DG 329 /// </summary> 330 /// <param name="ConnString">連接字元串,可以自定義,可以使用SqlHelper_DG.ConnString</param> 331 /// <param name="commandTextOrSpName">sql語句或存儲過程名稱</param> 332 /// <param name="commandType">命令類型 </param> 333 /// <param name="obj">object[]參數數組,允許空</param> 334 /// <returns></returns> 335 public static DataSet ExecuteDataSet(string ConnString, string commandTextOrSpName, CommandType commandType, params object[] obj) 336 { 337 try 338 { 339 using (SqlConnection conn = new SqlConnection(ConnString)) 340 { 341 using (SqlCommand cmd = new SqlCommand()) 342 { 343 PreparCommand(conn, cmd, commandTextOrSpName, commandType, obj); 344 using (SqlDataAdapter da = new SqlDataAdapter(cmd)) 345 { 346 DataSet ds = new DataSet(); 347 da.Fill(ds); 348 return ds; 349 } 350 } 351 } 352 } 353 catch (Exception) 354 { 355 return null; 356 } 357 } 358 #endregion