SqlHelper
1 /// <summary> 2 /// 数据库的通用访问代码 3 /// 此类为抽象类,不允许实例化,在应用时直接调用即可 4 /// </summary>SqlDataSource 5 public abstract class SqlHelper 6 { 7 //获取数据库连接字符串,其属于静态变量且只读,项目中所有文档可以直接使用,但不能修改 8 public static readonly string ConnectionString = ConfigurationManager.ConnectionStrings["mylifeConnectionString"].ConnectionString; 9 10 //public static readonly string ConnectionStringInventoryDistributedTransaction = ConfigurationManager.ConnectionStrings["SQLConnString2"].ConnectionString; 11 //public static readonly string ConnectionStringOrderDistributedTransaction = ConfigurationManager.ConnectionStrings["SQLConnString3"].ConnectionString; 12 //public static readonly string ConnectionStringProfile = ConfigurationManager.ConnectionStrings["SQLProfileConnString"].ConnectionString; 13 14 // 哈希表用来存储缓存的参数信息,哈希表可以存储任意类型的参数。 15 private static Hashtable parmCache = Hashtable.Synchronized(new Hashtable()); 16 private static SqlParameter[] parms = null; 17 18 /******************************执行带有多条SQL语句的事务的方法**************************************/ 19 public static int ExecuteNonQuery(string connectionString,bool IsTrans, CommandType cmdType, string [] cmdText, ArrayList pramsList) 20 { 21 22 //SqlCommand cmd = new SqlCommand(); 23 int pramsListIndex = 0; 24 25 SqlTransaction objTrans = null; 26 //用于返回数据受影响的行数 27 int val = 0; 28 29 try 30 { 31 using (SqlConnection conn = new SqlConnection(connectionString)) 32 { 33 foreach (string str in cmdText) 34 { 35 parms = (SqlParameter[])pramsList[pramsListIndex]; 36 37 //判断数据库连接状态 38 if (conn.State != ConnectionState.Open) 39 conn.Open(); 40 41 42 SqlCommand cmd = new SqlCommand(); 43 //判断 44 if (pramsListIndex == 0) 45 { 46 objTrans = conn.BeginTransaction(); 47 } 48 49 //通过PrePareCommand方法将参数逐个加入到SqlCommand的参数集合中 50 PrepareCommand(cmd, conn, objTrans, cmdType, str, parms); 51 52 val = cmd.ExecuteNonQuery(); 53 54 //清空SqlCommand中的参数列表 55 cmd.Parameters.Clear(); 56 pramsListIndex++; 57 } 58 //事务的提交 59 if (objTrans != null) objTrans.Commit(); 60 conn.Close(); 61 return val; 62 } 63 } 64 catch (Exception err) 65 { 66 val = -1; 67 //事务的回滚 68 if (objTrans != null) objTrans.Rollback(); 69 Console.WriteLine(err); 70 } 71 72 return val; 73 } 74 75 76 77 /// <summary> 78 ///执行一个不需要返回值的SqlCommand命令,通过指定专用的连接字符串。 79 /// 使用参数数组形式提供参数列表 80 /// </summary> 81 /// <remarks> 82 /// 使用示例: 83 /// int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24)); 84 /// </remarks> 85 /// <param name="connectionString">一个有效的数据库连接字符串</param> 86 /// <param name="cmdText">存储过程的名字或者 T-SQL 语句</param> 87 /// <param name="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param> 88 /// <param name="connectionString"></param> 89 /// <param name="cmdType"></param> 90 /// <returns>返回一个数值表示此SqlCommand命令执行后影响的行数</returns> 91 public static int ExecuteNonQuery(string connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) 92 { 93 94 SqlCommand cmd = new SqlCommand(); 95 96 using (SqlConnection conn = new SqlConnection(connectionString)) 97 { 98 //通过PrePareCommand方法将参数逐个加入到SqlCommand的参数集合中 99 PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters); 100 int val = cmd.ExecuteNonQuery(); 101 102 //清空SqlCommand中的参数列表 103 cmd.Parameters.Clear(); 104 conn.Close(); 105 return val; 106 } 107 } 108 109 110 /// <summary> 111 /// 测试调用存储过程 112 /// </summary> 113 /// <param name="connectionString"></param> 114 /// <param name="cmdType"></param> 115 /// <param name="cmdText"></param> 116 /// <param name="tableName"></param> 117 /// <param name="commandParameters"></param> 118 /// <returns></returns> 119 public static DataSet ExecuteDataSet(string connectionString, CommandType cmdType, string cmdText, string tableName,params SqlParameter[] commandParameters) 120 { 121 DataSet ds = new DataSet(); 122 using (SqlConnection conn = new SqlConnection(connectionString)) 123 { 124 conn.Open(); 125 SqlCommand cmd = new SqlCommand( ); 126 using (SqlDataAdapter da = new SqlDataAdapter()) 127 { 128 PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters); 129 da.SelectCommand = cmd; 130 da.Fill(ds, tableName); 131 cmd.Parameters.Clear(); 132 conn.Close(); 133 } 134 } 135 return ds ; 136 } 137 138 139 /// <summary> 140 ///执行一条不返回结果的SqlCommand,通过一个已经存在的数据库连接 141 /// 使用参数数组提供参数 142 /// </summary> 143 /// <remarks> 144 /// 使用示例: 145 /// int result = ExecuteNonQuery(conn, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24)); 146 /// </remarks> 147 /// <param name="connection">一个现有的数据库连接</param> 148 /// <param name="cmdType">SqlCommand命令类型 (存储过程, T-SQL语句, 等等。)</param> 149 /// <param name="cmdText">存储过程的名字或者 T-SQL 语句</param> 150 /// <param name="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param> 151 /// <returns>返回一个数值表示此SqlCommand命令执行后影响的行数</returns> 152 public static int ExecuteNonQuery(SqlConnection connection, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) 153 { 154 155 SqlCommand cmd = new SqlCommand(); 156 157 PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters); 158 int val = cmd.ExecuteNonQuery(); 159 cmd.Parameters.Clear(); 160 connection.Close(); 161 return val; 162 } 163 164 /// <summary> 165 /// 执行一条不返回结果的SqlCommand,通过一个已经存在的数据库事物处理 166 /// 使用参数数组提供参数 167 /// </summary> 168 /// <remarks> 169 /// 使用示例: 170 /// int result = ExecuteNonQuery(trans, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24)); 171 /// </remarks> 172 /// <param name="trans">一个存在的 sql 事物处理</param> 173 /// <param name="cmdType">SqlCommand命令类型 (存储过程, T-SQL语句, 等等。)</param> 174 /// <param name="cmdText">存储过程的名字或者 T-SQL 语句</param> 175 /// <param name="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param> 176 /// <returns>返回一个数值表示此SqlCommand命令执行后影响的行数</returns> 177 public static int ExecuteNonQuery(SqlTransaction trans, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) 178 { 179 SqlCommand cmd = new SqlCommand(); 180 PrepareCommand(cmd, trans.Connection, trans, cmdType, cmdText, commandParameters); 181 int val = cmd.ExecuteNonQuery(); 182 cmd.Parameters.Clear(); 183 trans.Connection.Close(); 184 return val; 185 } 186 187 /// <summary> 188 /// 执行一条返回结果集的SqlCommand命令,通过专用的连接字符串。 189 /// 使用参数数组提供参数 190 /// </summary> 191 /// <remarks> 192 /// 使用示例: 193 /// SqlDataReader r = ExecuteReader(connString, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24)); 194 /// </remarks> 195 /// <param name="connectionString">一个有效的数据库连接字符串</param> 196 /// <param name="cmdType">SqlCommand命令类型 (存储过程, T-SQL语句, 等等。)</param> 197 /// <param name="cmdText">存储过程的名字或者 T-SQL 语句</param> 198 /// <param name="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param> 199 /// <returns>返回一个包含结果的SqlDataReader</returns> 200 public static SqlDataReader ExecuteReader(string connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) 201 { 202 SqlCommand cmd = new SqlCommand(); 203 SqlConnection conn = new SqlConnection(connectionString); 204 205 // 在这里使用try/catch处理是因为如果方法出现异常,则SqlDataReader就不存在, 206 //CommandBehavior.CloseConnection的语句就不会执行,触发的异常由catch捕获。 207 //关闭数据库连接,并通过throw再次引发捕捉到的异常。 208 try 209 { 210 PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters); 211 SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection); 212 cmd.Parameters.Clear(); 213 return rdr; 214 } 215 catch 216 { 217 conn.Close(); 218 219 throw; 220 } 221 } 222 223 /// <summary> 224 /// 查询用于不带参数的select语句 225 /// </summary> 226 /// <param name="connectionString">连接字符串</param> 227 /// <param name="cmdType">查询语句的类型</param> 228 /// <param name="cmdText">查询的select语句</param> 229 /// <returns></returns> 230 public static SqlDataReader ExecuteReader(string connectionString, CommandType cmdType, string cmdText) 231 { 232 SqlCommand cmd = new SqlCommand(); 233 SqlConnection conn = new SqlConnection(connectionString); 234 235 // 在这里使用try/catch处理是因为如果方法出现异常,则SqlDataReader就不存在, 236 //CommandBehavior.CloseConnection的语句就不会执行,触发的异常由catch捕获。 237 //关闭数据库连接,并通过throw再次引发捕捉到的异常。 238 try 239 { 240 PrepareCommand(cmd, conn, null, cmdType, cmdText); 241 SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection); 242 cmd.Parameters.Clear(); 243 return rdr; 244 } 245 catch 246 { 247 conn.Close(); 248 throw; 249 } 250 } 251 252 /// <summary> 253 /// 执行一条返回第一条记录第一列的SqlCommand命令,通过专用的连接字符串。 254 /// 使用参数数组提供参数 255 /// </summary> 256 /// <remarks> 257 /// 使用示例: 258 /// Object obj = ExecuteScalar(connString, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24)); 259 /// </remarks> 260 /// <param name="connectionString">一个有效的数据库连接字符串</param> 261 /// <param name="cmdType">SqlCommand命令类型 (存储过程, T-SQL语句, 等等。)</param> 262 /// <param name="cmdText">存储过程的名字或者 T-SQL 语句</param> 263 /// <param name="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param> 264 /// <returns>返回一个object类型的数据,可以通过 Convert.To{Type}方法转换类型</returns> 265 public static object ExecuteScalar(string connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) 266 { 267 SqlCommand cmd = new SqlCommand(); 268 269 using (SqlConnection connection = new SqlConnection(connectionString)) 270 { 271 PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters); 272 object val = cmd.ExecuteScalar(); 273 cmd.Parameters.Clear(); 274 connection.Close(); 275 return val; 276 } 277 } 278 279 /// <summary> 280 /// 执行一条返回第一条记录第一列的SqlCommand命令,通过已经存在的数据库连接。 281 /// 使用参数数组提供参数 282 /// </summary> 283 /// <remarks> 284 /// 使用示例: 285 /// Object obj = ExecuteScalar(connString, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24)); 286 /// </remarks> 287 /// <param name="connection">一个已经存在的数据库连接</param> 288 /// <param name="cmdType">SqlCommand命令类型 (存储过程, T-SQL语句, 等等。)</param> 289 /// <param name="cmdText">存储过程的名字或者 T-SQL 语句</param> 290 /// <param name="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param> 291 /// <returns>返回一个object类型的数据,可以通过 Convert.To{Type}方法转换类型</returns> 292 public static object ExecuteScalar(SqlConnection connection, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) 293 { 294 295 var cmd = new SqlCommand(); 296 297 PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters); 298 object val = cmd.ExecuteScalar(); 299 cmd.Parameters.Clear(); 300 connection.Close(); 301 return val; 302 } 303 304 305 306 /// <summary> 307 /// 缓存参数数组 308 /// </summary> 309 /// <param name="cacheKey">参数缓存的键值</param> 310 /// <param name="commandParameters">被缓存的参数列表</param> 311 public static void CacheParameters(string cacheKey, params SqlParameter[] commandParameters) 312 { 313 parmCache[cacheKey] = commandParameters; 314 } 315 316 /// <summary> 317 /// 获取被缓存的参数 318 /// </summary> 319 /// <param name="cacheKey">用于查找参数的KEY值</param> 320 /// <returns>返回缓存的参数数组</returns> 321 public static SqlParameter[] GetCachedParameters(string cacheKey) 322 { 323 SqlParameter[] cachedParms = (SqlParameter[])parmCache[cacheKey]; 324 325 if (cachedParms == null) 326 return null; 327 328 //新建一个参数的克隆列表 329 SqlParameter[] clonedParms = new SqlParameter[cachedParms.Length]; 330 331 //通过循环为克隆参数列表赋值 332 for (int i = 0, j = cachedParms.Length; i < j; i++) 333 //使用clone方法复制参数列表中的参数 334 clonedParms[i] = (SqlParameter)((ICloneable)cachedParms[i]).Clone(); 335 336 return clonedParms; 337 } 338 339 /// <summary> 340 /// 为执行命令准备参数 341 /// </summary> 342 /// <param name="cmd">SqlCommand 命令</param> 343 /// <param name="conn">已经存在的数据库连接</param> 344 /// <param name="trans">数据库事物处理</param> 345 /// <param name="cmdType">SqlCommand命令类型 (存储过程, T-SQL语句, 等等。)</param> 346 /// <param name="cmdText">Command text,T-SQL语句 例如 Select * from Products</param> 347 /// <param name="cmdParms">返回带参数的命令</param> 348 private static void PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans, CommandType cmdType, string cmdText, SqlParameter[] cmdParms) 349 { 350 351 //判断数据库连接状态 352 if (conn.State != ConnectionState.Open) 353 conn.Open(); 354 355 cmd.Connection = conn; 356 cmd.CommandText = cmdText; 357 358 //判断是否需要事物处理 359 if (trans != null) 360 cmd.Transaction = trans; 361 362 cmd.CommandType = cmdType; 363 364 if (cmdParms != null) 365 { 366 foreach (SqlParameter parm in cmdParms) 367 cmd.Parameters.Add(parm); 368 } 369 } 370 371 /// <summary> 372 /// 和上面的方法比就是少了个查询的参数 373 /// </summary> 374 /// <param name="cmd">SqlCommand命令</param> 375 /// <param name="conn">已经存在的数据库的连接</param> 376 /// <param name="trans">数据库事物处理</param> 377 /// <param name="cmdType">SqlCommand命令类型 (存储过程, T-SQL语句, 等等。)</param> 378 /// <param name="cmdText">Command text,T-SQL语句 例如 Select * from Products</param> 379 private static void PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans, CommandType cmdType, string cmdText) 380 { 381 382 //判断数据库连接状态 383 if (conn.State != ConnectionState.Open) 384 conn.Open(); 385 386 cmd.Connection = conn; 387 cmd.CommandText = cmdText; 388 389 //判断是否需要事物处理 390 if (trans != null) 391 cmd.Transaction = trans; 392 393 cmd.CommandType = cmdType; 394 } 395 396 }