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);