自己寫ORM框架 SqlHelper_DG C#(java的寫在鏈接里)

来源:http://www.cnblogs.com/qixiaoyizhan/archive/2016/08/29/5818298.html
-Advertisement-
Play Games

本文為七小站主原創作品,轉載請註明出處: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
	   

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Microsoft Office Web Apps(以下簡稱OWA)是由微軟推出的基於Web端的線上辦公工具,它將Microsoft Office產品的體驗延伸到可支持的瀏覽器上。OWA讓你可以在任何地方共用自己的Office文檔。 ...
  • 1)讀取所有視圖: 2)讀取視圖的名稱: ...
  • hibernate 簡介:hibernate是一個開源框架,它是對象關聯關係映射的框架,它對JDBC做了輕量級的封裝,而我們java程式員可以使用面向對象的思想來操縱資料庫。hibernate核心介面session:負責被持久化對象CRUD操作sessionFactory:負責初始化hibernat ...
  • 【開源】.Net 免費開源,靜態Aop織入(直接修改IL中間語言)框架,類似PostSharp(收費);實現前後Aop切麵和INotifyPropertyChanged註入方式,性能接近原生編碼方式實現。 ...
  • 1.介紹 2.自定義 Filter V1.0 3.調試分析出現問題的原因 4.自定義 Filter V2.0 ...
  • 最近工作壓力比較大,不得已開始自學C#。同時網站開發業務開展迫在眉睫,只能先從ASP.NET學起。回想一下,連C#和ASP.NET的關係都沒有明白,就被趕鴨子上架了。。。我覺得這將是我工作以來最具有戲劇性的一筆!! 話不多說,網上搜了一下洞庭夕照的“學用MVC4做網站”,感覺最後從我現在的水平看實在 ...
  • ...
  • ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...