自己寫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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...