C#实现较为实用的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":
391                     dbType = SqlDbType.Variant;
392                     break;
393             }
394             return dbType;
395         }
396 
397     }

  可以直接这样调用:

1 IDictionary<string, object> values = new Dictionary<string, object>();
2 values.Add("@UserName", UserName);            
3 values.Add("@PassWord", passWord);
4 object Scalar = SQLHelper.QueryScalar(SQLHelper.BestNet, SQLHelper.UserInfoCURD, CommandType.StoredProcedure, values);    

 

posted @ 2016-10-05 20:04  天空的影子  阅读(12181)  评论(3编辑  收藏  举报