C#實現較為實用的SQLhelper

来源:http://www.cnblogs.com/bestckk/archive/2016/10/05/5932746.html
-Advertisement-
Play Games

第一次寫博客,想不到寫什麼好b( ̄▽ ̄)d ,考慮的半天決定從sqlhelper開始,sqlhelper對程式員來說就像helloworld一樣,很簡單卻又很重要,helloworld代表著程式員萌新第一次寫代碼,而sqlhelper則是初次接觸資料庫(不知道這種說法對不對)。 好了不廢話了,下麵直 ...


  第一次寫博客,想不到寫什麼好b( ̄▽ ̄)d ,考慮的半天決定從sqlhelper開始,sqlhelper對程式員來說就像helloworld一樣,很簡單卻又很重要,helloworld代表著程式員萌新第一次寫代碼,而sqlhelper則是初次接觸資料庫(不知道這種說法對不對)。

  好了不廢話了,下麵直接上代碼(無話可說了):

  1     public class SQLHelper
  2     {
  3         // 超時時間
  4         private static int Timeout = 1000;
  5         // 資料庫名稱
  6         public const String BestNet = "BestNet";
  7         //存儲過程名稱
  8         public const String UserInfoCURD = "UserInfoCURD";
  9         // 資料庫連接字元串
 10         private static Dictionary<String, String> ConnStrs = new Dictionary<String, String>();
 11 
 12         /// <summary>
 13         /// SQLServer操作類(靜態構造函數)
 14         /// </summary>
 15         static SQLHelper()
 16         {
 17             ConnectionStringSettingsCollection configs = WebConfigurationManager.ConnectionStrings;
 18             foreach (ConnectionStringSettings config in configs)
 19             {
 20                 ConnStrs.Add(config.Name, config.ConnectionString);
 21             }
 22         }
 23 
 24         /// <summary>
 25         /// 獲取資料庫連接
 26         /// </summary>
 27         /// <param name="database">資料庫(配置文件內connectionStrings的name)</param>
 28         /// <returns>資料庫連接</returns>
 29         private static SqlConnection GetConnection(string database)
 30         {
 31             if (string.IsNullOrEmpty(database))
 32             {
 33                 throw new Exception("未設置參數:database");
 34             }
 35             if (!ConnStrs.ContainsKey(database))
 36             {
 37                 throw new Exception("未找到資料庫:" + database);
 38             }
 39             return new SqlConnection(ConnStrs[database]);
 40         }
 41 
 42         /// <summary>
 43         /// 獲取SqlCommand
 44         /// </summary>
 45         /// <param name="conn">SqlConnection</param>
 46         /// <param name="transaction">SqlTransaction</param>
 47         /// <param name="cmdType">CommandType</param>
 48         /// <param name="sql">SQL</param>
 49         /// <param name="parms">SqlParameter數組</param>
 50         /// <returns></returns>
 51         private static SqlCommand GetCommand(SqlConnection conn, SqlTransaction transaction, CommandType cmdType, string sql, SqlParameter[] parms)
 52         {
 53             SqlCommand cmd = new SqlCommand(sql, conn);
 54             cmd.CommandType = cmdType;
 55             cmd.CommandTimeout = Timeout;
 56             if (transaction != null)
 57                 cmd.Transaction = transaction;
 58             if (parms != null && parms.Length != 0)
 59                 cmd.Parameters.AddRange(parms);
 60             return cmd;
 61         }
 62 
 63         /// <summary>
 64         /// 查詢數據,返回DataTable
 65         /// </summary>
 66         /// <param name="database">資料庫</param>
 67         /// <param name="sql">SQL語句或存儲過程名</param>
 68         /// <param name="parms">參數</param>
 69         /// <param name="cmdType">查詢類型(SQL語句/存儲過程名)</param>
 70         /// <returns>DataTable</returns>
 71         public static DataTable QueryDataTable(string database, string sql, SqlParameter[] parms, CommandType cmdType)
 72         {
 73             if (string.IsNullOrEmpty(database))
 74             {
 75                 throw new Exception("未設置參數:database");
 76             }
 77             if (string.IsNullOrEmpty(sql))
 78             {
 79                 throw new Exception("未設置參數:sql");
 80             }
 81 
 82             try
 83             {
 84                 using (SqlConnection conn = GetConnection(database))
 85                 {
 86                     conn.Open();
 87 
 88                     using (SqlCommand cmd = GetCommand(conn, null, cmdType, sql, parms))
 89                     {
 90                         using (SqlDataAdapter da = new SqlDataAdapter(cmd))
 91                         {
 92                             DataTable dt = new DataTable();
 93                             da.Fill(dt);
 94                             return dt;
 95                         }
 96                     }
 97                 }
 98             }
 99             catch (SqlException ex)
100             {
101                 System.Text.StringBuilder log = new System.Text.StringBuilder();
102                 log.Append("查詢數據出錯:");
103                 log.Append(ex);
104                 throw new Exception(log.ToString());
105             }
106         }
107 
108         /// <summary>
109         /// 查詢數據,返回DataSet
110         /// </summary>
111         /// <param name="database">資料庫</param>
112         /// <param name="sql">SQL語句或存儲過程名</param>
113         /// <param name="parms">參數</param>
114         /// <param name="cmdType">查詢類型(SQL語句/存儲過程名)</param>
115         /// <returns>DataSet</returns>
116         public static DataSet QueryDataSet(string database, string sql, SqlParameter[] parms, CommandType cmdType)
117         {
118             if (string.IsNullOrEmpty(database))
119             {
120                 throw new Exception("未設置參數:database");
121             }
122             if (string.IsNullOrEmpty(sql))
123             {
124                 throw new Exception("未設置參數:sql");
125             }
126 
127             try
128             {
129                 using (SqlConnection conn = GetConnection(database))
130                 {
131                     conn.Open();
132 
133                     using (SqlCommand cmd = GetCommand(conn, null, cmdType, sql, parms))
134                     {
135                         using (SqlDataAdapter da = new SqlDataAdapter(cmd))
136                         {
137                             DataSet ds = new DataSet();
138                             da.Fill(ds);
139                             return ds;
140                         }
141                     }
142                 }
143             }
144             catch (SqlException ex)
145             {
146                 System.Text.StringBuilder log = new System.Text.StringBuilder();
147                 log.Append("查詢數據出錯:");
148                 log.Append(ex);
149                 throw new Exception(log.ToString());
150             }
151         }
152 
153         /// <summary>
154         /// 執行命令獲取唯一值(第一行第一列)
155         /// </summary>
156         /// <param name="database">資料庫</param>
157         /// <param name="sql">SQL語句或存儲過程名</param>
158         /// <param name="parms">參數</param>
159         /// <param name="cmdType">查詢類型(SQL語句/存儲過程名)</param>
160         /// <returns>獲取值</returns>
161         public static object QueryScalar(string database, string sql, SqlParameter[] parms, CommandType cmdType)
162         {
163             if (string.IsNullOrEmpty(database))
164             {
165                 throw new Exception("未設置參數:database");
166             }
167             if (string.IsNullOrEmpty(sql))
168             {
169                 throw new Exception("未設置參數:sql");
170             }
171             try
172             {
173                 using (SqlConnection conn = GetConnection(database))
174                 {
175                     conn.Open();
176 
177                     using (SqlCommand cmd = GetCommand(conn, null, cmdType, sql, parms))
178                     {
179                         return cmd.ExecuteScalar();
180                     }
181                 }
182             }
183             catch (SqlException ex)
184             {
185                 System.Text.StringBuilder log = new System.Text.StringBuilder();
186                 log.Append("處理出錯:");
187                 log.Append(ex);
188                 throw new Exception(log.ToString());
189             }
190         }
191 
192         /// <summary>
193         /// 執行命令更新數據
194         /// </summary>
195         /// <param name="database">資料庫</param>
196         /// <param name="sql">SQL語句或存儲過程名</param>
197         /// <param name="parms">參數</param>
198         /// <param name="cmdType">查詢類型(SQL語句/存儲過程名)</param>
199         /// <returns>更新的行數</returns>
200         public static int Execute(string database, string sql, SqlParameter[] parms, CommandType cmdType)
201         {
202             if (string.IsNullOrEmpty(database))
203             {
204                 throw new Exception("未設置參數:database");
205             }
206             if (string.IsNullOrEmpty(sql))
207             {
208                 throw new Exception("未設置參數:sql");
209             }
210 
211             //返回(增刪改)的更新行數
212             int count = 0;
213 
214             try
215             {
216                 using (SqlConnection conn = GetConnection(database))
217                 {
218                     conn.Open();
219 
220                     using (SqlCommand cmd = GetCommand(conn, null, cmdType, sql, parms))
221                     {
222                         if (cmdType == CommandType.StoredProcedure)
223                             cmd.Parameters.AddWithValue("@RETURN_VALUE", "").Direction = ParameterDirection.ReturnValue;
224 
225                         count = cmd.ExecuteNonQuery();
226 
227                         if (count <= 0)
228                             if (cmdType == CommandType.StoredProcedure)
229                                 count = (int)cmd.Parameters["@RETURN_VALUE"].Value;
230                     }
231                 }
232             }
233             catch (SqlException ex)
234             {
235                 System.Text.StringBuilder log = new System.Text.StringBuilder();
236                 log.Append("處理出錯:");
237                 log.Append(ex);
238                 throw new Exception(log.ToString());
239             }
240             return count;
241         }
242 
243         /// <summary>
244         /// 查詢數據,返回DataTable
245         /// </summary>
246         /// <param name="database">資料庫</param>
247         /// <param name="sql">SQL語句或存儲過程名</param>
248         /// <param name="cmdType">查詢類型(SQL語句/存儲過程名)</param>
249         /// <param name="values">參數</param>
250         /// <returns>DataTable</returns>
251         public static DataTable QueryDataTable(string database, string sql, CommandType cmdType, IDictionary<string, object> values)
252         {
253             SqlParameter[] parms = DicToParams(values);
254             return QueryDataTable(database, sql, parms, cmdType);
255         }
256 
257         /// <summary>
258         /// 執行存儲過程查詢數據,返回DataSet
259         /// </summary>
260         /// <param name="database">資料庫</param>
261         /// <param name="sql">SQL語句或存儲過程名</param>
262         /// <param name="cmdType">查詢類型(SQL語句/存儲過程名)</param>
263         /// <param name="values">參數
264         /// <returns>DataSet</returns>
265         public static DataSet QueryDataSet(string database, string sql, CommandType cmdType, IDictionary<string, object> values)
266         {
267             SqlParameter[] parms = DicToParams(values);
268             return QueryDataSet(database, sql, parms, cmdType);
269         }
270 
271         /// <summary>
272         /// 執行命令獲取唯一值(第一行第一列)
273         /// </summary>
274         /// <param name="database">資料庫</param>
275         /// <param name="sql">SQL語句或存儲過程名</param>
276         /// <param name="cmdType">查詢類型(SQL語句/存儲過程名)</param>
277         /// <param name="values">參數</param>
278         /// <returns>唯一值</returns>
279         public static object QueryScalar(string database, string sql, CommandType cmdType, IDictionary<string, object> values)
280         {
281             SqlParameter[] parms = DicToParams(values);
282             return QueryScalar(database, sql, parms, cmdType);
283         }
284 
285         /// <summary>
286         /// 執行命令更新數據
287         /// </summary>
288         /// <param name="database">資料庫</param>
289         /// <param name="sql">SQL語句或存儲過程名</param>
290         /// <param name="cmdType">查詢類型(SQL語句/存儲過程名)</param>
291         /// <param name="values">參數</param>
292         /// <returns>更新的行數</returns>
293         public static int Execute(string database, string sql, CommandType cmdType, IDictionary<string, object> values)
294         {
295             SqlParameter[] parms = DicToParams(values);
296             return Execute(database, sql, parms, cmdType);
297         }
298 
299         /// <summary>
300         /// 創建參數
301         /// </summary>
302         /// <param name="name">參數名</param>
303         /// <param name="type">參數類型</param>
304         /// <param name="size">參數大小</param>
305         /// <param name="direction">參數方向(輸入/輸出)</param>
306         /// <param name="value">參數值</param>
307         /// <returns>新參數對象</returns>
308         public static SqlParameter[] DicToParams(IDictionary<string, object> values)
309         {
310             if (values == null) return null;
311 
312             SqlParameter[] parms = new SqlParameter[values.Count];
313             int index = 0;
314             foreach (KeyValuePair<string, object> kv in values)
315             {
316                 SqlParameter parm = null;
317                 if (kv.Value == null)
318                 {
319                     parm = new SqlParameter(kv.Key, DBNull.Value);
320                 }
321                 else
322                 {
323                     Type t = kv.Value.GetType();
324                     parm = new SqlParameter(kv.Key, NetToSql(kv.Value.GetType()));
325                     parm.Value = kv.Value;
326                 }
327 
328                 parms[index++] = parm;
329             }
330             return parms;
331         }
332 
333 
334         /// <summary>
335         /// .net類型轉換為Sql類型
336         /// </summary>
337         /// <param name="t">.net類型</param>
338         /// <returns>Sql類型</returns>
339         public static SqlDbType NetToSql(Type t)
340         {
341             SqlDbType dbType = SqlDbType.Variant;
342             switch (t.Name)
343             {
344                 case "Int16":
345                     dbType = SqlDbType.SmallInt;
346                     break;
347                 case "Int32":
348                     dbType = SqlDbType.Int;
349                     break;
350                 case "Int64":
351                     dbType = SqlDbType.BigInt;
352                     break;
353                 case "Single":
354                     dbType = SqlDbType.Real;
355                     break;
356                 case "Decimal":
357                     dbType = SqlDbType.Decimal;
358                     break;
359 
360                 case "Byte[]":
361                     dbType = SqlDbType.VarBinary;
362                     break;
363                 case "Boolean":
364                     dbType = SqlDbType.Bit;
365                     break;
366                 case "String":
367                     dbType = SqlDbType.NVarChar;
368                     break;
369                 case "Char[]":
370                     dbType = SqlDbType.Char;
371                     break;
372                 case "DateTime":
373                     dbType = SqlDbType.DateTime;
374                     break;
375                 case "DateTime2":
376                     dbType = SqlDbType.DateTime2;
377                     break;
378                 case "DateTimeOffset":
379                     dbType = SqlDbType.DateTimeOffset;
380                     break;
381                 case "TimeSpan":
382                     dbType = SqlDbType.Time;
383                     break;
384                 case "Guid":
385                     dbType = SqlDbType.UniqueIdentifier;
386                     break;
387                 case "Xml":
388                     dbType = SqlDbType.Xml;
389                     break;
390                 case "Object"	   

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

-Advertisement-
Play Games
更多相關文章
  • 1、JQuery對象“ 如: $(‘div’).text("div展示的信息") 可以看成”是一個包含一個dom數組 和 包含所有Jquery方法的容器 2、每當我們調用選擇器方法查找dom樹里的元素時,其實就是把找到的dom元素存入一個JQ對象里的dom數組中,然後再把這個JQ對象返回。 當我們調 ...
  • 多態之抽象類與介面的相似點及不同點,剛學習的一點收穫,或許不是很完整,借鑒看視頻及一些被人寫的文章自己寫的下的一些心得!以便之久複習使用! 一、抽象類 (1) 抽象方法只作聲明,而不包含實現,可以看成是沒有實現體的虛方法 (2) 抽象類不能被實例化 (3) 抽象類可以但不是必須有抽象屬性和抽象方法, ...
  • 多態之抽象類與虛方法的相似點及不同點 : 不同點 1、方法關鍵字不一樣 虛方法的方法關鍵字是:virtual。 抽象類的方法關鍵詞是:abstract 2、基類的方法是否有方法體/實現 虛方法的方法:聲明並實現方法。 抽象類的方法:只作聲明,無方法體/無實現。 共同點 1、子類/派生類都要重寫父類的 ...
  • Web Is JavaScript Single-Threaded? Quill 1.0 – Better Rich Text Editor for Web Apps Next Generation Server Compression With Brotli Debugging With Node... ...
  • 對於新手的我,現在搞不了大項目,只有從小實驗小項目一點一滴做起。今天就把自己寫的猜拳小游戲給大家分享一下。適合新手一起學習。。 using System; using System.Collections.Generic; using System.ComponentModel; using Sys ...
  • web 發展迅猛,技術日新月異層出不窮,web 的安全性同樣是一場持久的攻防戰。而 HTTPS 的普及,為 web 通信構建了更加良好和安全的根基。 ...
  • 我用vs2015寫了個小網站,.Net Framework4.5、 mvc 5,發佈到本機iis上正常,在美橙申請了一個雲虛擬機,發佈過程中遇到的一些問題記錄如下: 1、伺服器支持的版本比較低 上傳後打開網站顯示: HTTP 錯誤 404.0 - Not Found您要找的資源已被刪除、已更名或暫時 ...
  • 如果你在設置asp.net mvc自定義錯誤頁面時遇到問題,這並不止你一個人。驚訝之餘你的做法是正確的,沒有起到作用的原因是其一部分錯誤是由asp.net管道處理的,另一部分是由iis直接處理。 通常情況 (我期望是這種情況,在一些其他框架/伺服器上) 我們只需要在一個地方配置自定義錯誤頁就可以了, ...
一周排行
    -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# ...