转载自:http://blog.csdn.net/fengqingtao2008/article/details/17399247
1 using System; 2 using System.Data; 3 using System.Xml; 4 using System.Data.SqlClient; 5 using System.Collections; 6 using System.Configuration; 7 8 namespace BookDAL 9 { 10 /// <summary> 11 /// SqlServer数据访问帮助类 12 /// </summary> 13 public sealed class SqlHelper 14 { 15 #region 私有构造函数和方法 16 17 private SqlHelper() { } 18 19 /// <summary> 20 /// 将SqlParameter参数数组(参数值)分配给SqlCommand命令. 21 /// 这个方法将给任何一个参数分配DBNull.Value; 22 /// 该操作将阻止默认值的使用. 23 /// </summary> 24 /// <param name="command">命令名</param> 25 /// <param name="commandParameters">SqlParameters数组</param> 26 private static void AttachParameters(SqlCommand command, SqlParameter[] commandParameters) 27 { 28 if (command == null) throw new ArgumentNullException("command"); 29 if (commandParameters != null) 30 { 31 foreach (SqlParameter p in commandParameters) 32 { 33 if (p != null) 34 { 35 // 检查未分配值的输出参数,将其分配以DBNull.Value. 36 if ((p.Direction == ParameterDirection.InputOutput || p.Direction == ParameterDirection.Input) && 37 (p.Value == null)) 38 { 39 p.Value = DBNull.Value; 40 } 41 command.Parameters.Add(p); 42 } 43 } 44 } 45 } 46 47 /// <summary> 48 /// 将DataRow类型的列值分配到SqlParameter参数数组. 49 /// </summary> 50 /// <param name="commandParameters">要分配值的SqlParameter参数数组</param> 51 /// <param name="dataRow">将要分配给存储过程参数的DataRow</param> 52 private static void AssignParameterValues(SqlParameter[] commandParameters, DataRow dataRow) 53 { 54 if ((commandParameters == null) || (dataRow == null)) 55 { 56 return; 57 } 58 59 int i = 0; 60 // 设置参数值 61 foreach (SqlParameter commandParameter in commandParameters) 62 { 63 // 创建参数名称,如果不存在,只抛出一个异常. 64 if (commandParameter.ParameterName == null || 65 commandParameter.ParameterName.Length <= 1) 66 throw new Exception( 67 string.Format("请提供参数{0}一个有效的名称{1}.", i, commandParameter.ParameterName)); 68 // 从dataRow的表中获取为参数数组中数组名称的列的索引. 69 // 如果存在和参数名称相同的列,则将列值赋给当前名称的参数. 70 if (dataRow.Table.Columns.IndexOf(commandParameter.ParameterName.Substring(1)) != -1) 71 commandParameter.Value = dataRow[commandParameter.ParameterName.Substring(1)]; 72 i++; 73 } 74 } 75 76 /// <summary> 77 /// 将一个对象数组分配给SqlParameter参数数组. 78 /// </summary> 79 /// <param name="commandParameters">要分配值的SqlParameter参数数组</param> 80 /// <param name="parameterValues">将要分配给存储过程参数的对象数组</param> 81 private static void AssignParameterValues(SqlParameter[] commandParameters, object[] parameterValues) 82 { 83 if ((commandParameters == null) || (parameterValues == null)) 84 { 85 return; 86 } 87 88 // 确保对象数组个数与参数个数匹配,如果不匹配,抛出一个异常. 89 if (commandParameters.Length != parameterValues.Length) 90 { 91 throw new ArgumentException("参数值个数与参数不匹配."); 92 } 93 94 // 给参数赋值 95 for (int i = 0, j = commandParameters.Length; i < j; i++) 96 { 97 // If the current array value derives from IDbDataParameter, then assign its Value property 98 if (parameterValues[i] is IDbDataParameter) 99 { 100 IDbDataParameter paramInstance = (IDbDataParameter)parameterValues[i]; 101 if (paramInstance.Value == null) 102 { 103 commandParameters[i].Value = DBNull.Value; 104 } 105 else 106 { 107 commandParameters[i].Value = paramInstance.Value; 108 } 109 } 110 else if (parameterValues[i] == null) 111 { 112 commandParameters[i].Value = DBNull.Value; 113 } 114 else 115 { 116 commandParameters[i].Value = parameterValues[i]; 117 } 118 } 119 } 120 121 /// <summary> 122 /// 预处理用户提供的命令,数据库连接/事务/命令类型/参数 123 /// </summary> 124 /// <param name="command">要处理的SqlCommand</param> 125 /// <param name="connection">数据库连接</param> 126 /// <param name="transaction">一个有效的事务或者是null值</param> 127 /// <param name="commandType">命令类型 (存储过程,命令文本, 其它.)</param> 128 /// <param name="commandText">存储过程名或都T-SQL命令文本</param> 129 /// <param name="commandParameters">和命令相关联的SqlParameter参数数组,如果没有参数为'null'</param> 130 /// <param name="mustCloseConnection"><c>true</c> 如果连接是打开的,则为true,其它情况下为false.</param> 131 private static void PrepareCommand(SqlCommand command, SqlConnection connection, SqlTransaction transaction, CommandType commandType, string commandText, SqlParameter[] commandParameters, out bool mustCloseConnection) 132 { 133 if (command == null) throw new ArgumentNullException("command"); 134 if (commandText == null || commandText.Length == 0) throw new ArgumentNullException("commandText"); 135 136 // If the provided connection is not open, we will open it 137 if (connection.State != ConnectionState.Open) 138 { 139 mustCloseConnection = true; 140 connection.Open(); 141 } 142 else 143 { 144 mustCloseConnection = false; 145 } 146 147 // 给命令分配一个数据库连接. 148 command.Connection = connection; 149 150 // 设置命令文本(存储过程名或SQL语句) 151 command.CommandText = commandText; 152 153 // 分配事务 154 if (transaction != null) 155 { 156 if (transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction"); 157 command.Transaction = transaction; 158 } 159 160 // 设置命令类型. 161 command.CommandType = commandType; 162 163 // 分配命令参数 164 if (commandParameters != null) 165 { 166 AttachParameters(command, commandParameters); 167 } 168 return; 169 } 170 171 #endregion 私有构造函数和方法结束 172 173 #region 数据库连接 174 /// <summary> 175 /// 一个有效的数据库连接字符串 176 /// </summary> 177 /// <returns></returns> 178 public static string GetConnSting() 179 { 180 return ConfigurationManager.ConnectionStrings["ConStr"].ConnectionString; 181 } 182 /// <summary> 183 /// 一个有效的数据库连接对象 184 /// </summary> 185 /// <returns></returns> 186 public static SqlConnection GetConnection() 187 { 188 SqlConnection Connection = new SqlConnection(SqlHelper.GetConnSting()); 189 return Connection; 190 } 191 #endregion 192 193 #region ExecuteNonQuery命令 194 195 /// <summary> 196 /// 执行指定连接字符串,类型的SqlCommand. 197 /// </summary> 198 /// <remarks> 199 /// 示例: 200 /// int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders"); 201 /// </remarks> 202 /// <param name="connectionString">一个有效的数据库连接字符串</param> 203 /// <param name="commandType">命令类型 (存储过程,命令文本, 其它.)</param> 204 /// <param name="commandText">存储过程名称或SQL语句</param> 205 /// <returns>返回命令影响的行数</returns> 206 public static int ExecuteNonQuery(string connectionString, CommandType commandType, string commandText) 207 { 208 return ExecuteNonQuery(connectionString, commandType, commandText, (SqlParameter[])null); 209 } 210 211 /// <summary> 212 /// 执行指定连接字符串,类型的SqlCommand.如果没有提供参数,不返回结果. 213 /// </summary> 214 /// <remarks> 215 /// 示例: 216 /// int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24)); 217 /// </remarks> 218 /// <param name="connectionString">一个有效的数据库连接字符串</param> 219 /// <param name="commandType">命令类型 (存储过程,命令文本, 其它.)</param> 220 /// <param name="commandText">存储过程名称或SQL语句</param> 221 /// <param name="commandParameters">SqlParameter参数数组</param> 222 /// <returns>返回命令影响的行数</returns> 223 public static int ExecuteNonQuery(string connectionString, CommandType commandType, string commandText, params SqlParameter[] commandParameters) 224 { 225 if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString"); 226 227 using (SqlConnection connection = new SqlConnection(connectionString)) 228 { 229 connection.Open(); 230 231 return ExecuteNonQuery(connection, commandType, commandText, commandParameters); 232 } 233 } 234 235 /// <summary> 236 /// 执行指定连接字符串的存储过程,将对象数组的值赋给存储过程参数, 237 /// 此方法需要在参数缓存方法中探索参数并生成参数. 238 /// </summary> 239 /// <remarks> 240 /// 这个方法没有提供访问输出参数和返回值. 241 /// 示例: 242 /// int result = ExecuteNonQuery(connString, "PublishOrders", 24, 36); 243 /// </remarks> 244 /// <param name="connectionString">一个有效的数据库连接字符串/param> 245 /// <param name="spName">存储过程名称</param> 246 /// <param name="parameterValues">分配到存储过程输入参数的对象数组</param> 247 /// <returns>返回受影响的行数</returns> 248 public static int ExecuteNonQuery(string connectionString, string spName, params object[] parameterValues) 249 { 250 if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString"); 251 if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); 252 253 // 如果存在参数值 254 if ((parameterValues != null) && (parameterValues.Length > 0)) 255 { 256 // 从探索存储过程参数(加载到缓存)并分配给存储过程参数数组. 257 SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connectionString, spName); 258 259 // 给存储过程参数赋值 260 AssignParameterValues(commandParameters, parameterValues); 261 262 return ExecuteNonQuery(connectionString, CommandType.StoredProcedure, spName, commandParameters); 263 } 264 else 265 { 266 // 没有参数情况下 267 return ExecuteNonQuery(connectionString, CommandType.StoredProcedure, spName); 268 } 269 } 270 271 /// <summary> 272 /// 执行指定数据库连接对象的命令 273 /// </summary> 274 /// <remarks> 275 /// 示例: 276 /// int result = ExecuteNonQuery(conn, CommandType.StoredProcedure, "PublishOrders"); 277 /// </remarks> 278 /// <param name="connection">一个有效的数据库连接对象</param> 279 /// <param name="commandType">命令类型(存储过程,命令文本或其它.)</param> 280 /// <param name="commandText">存储过程名称或T-SQL语句</param> 281 /// <returns>返回影响的行数</returns> 282 public static int ExecuteNonQuery(SqlConnection connection, CommandType commandType, string commandText) 283 { 284 return ExecuteNonQuery(connection, commandType, commandText, (SqlParameter[])null); 285 } 286 287 /// <summary> 288 /// 执行指定数据库连接对象的命令 289 /// </summary> 290 /// <remarks> 291 /// 示例: 292 /// int result = ExecuteNonQuery(conn, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24)); 293 /// </remarks> 294 /// <param name="connection">一个有效的数据库连接对象</param> 295 /// <param name="commandType">命令类型(存储过程,命令文本或其它.)</param> 296 /// <param name="commandText">T存储过程名称或T-SQL语句</param> 297 /// <param name="commandParameters">SqlParamter参数数组</param> 298 /// <returns>返回影响的行数</returns> 299 public static int ExecuteNonQuery(SqlConnection connection, CommandType commandType, string commandText, params SqlParameter[] commandParameters) 300 { 301 if (connection == null) throw new ArgumentNullException("connection"); 302 303 // 创建SqlCommand命令,并进行预处理 304 SqlCommand cmd = new SqlCommand(); 305 bool mustCloseConnection = false; 306 PrepareCommand(cmd, connection, (SqlTransaction)null, commandType, commandText, commandParameters, out mustCloseConnection); 307 308 // Finally, execute the command 309 int retval = cmd.ExecuteNonQuery(); 310 311 // 清除参数,以便再次使用. 312 cmd.Parameters.Clear(); 313 if (mustCloseConnection) 314 connection.Close(); 315 return retval; 316 } 317 318 /// <summary> 319 /// 执行指定数据库连接对象的命令,将对象数组的值赋给存储过程参数. 320 /// </summary> 321 /// <remarks> 322 /// 此方法不提供访问存储过程输出参数和返回值 323 /// 示例: 324 /// int result = ExecuteNonQuery(conn, "PublishOrders", 24, 36); 325 /// </remarks> 326 /// <param name="connection">一个有效的数据库连接对象</param> 327 /// <param name="spName">存储过程名</param> 328 /// <param name="parameterValues">分配给存储过程输入参数的对象数组</param> 329 /// <returns>返回影响的行数</returns> 330 public static int ExecuteNonQuery(SqlConnection connection, string spName, params object[] parameterValues) 331 { 332 if (connection == null) throw new ArgumentNullException("connection"); 333 if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); 334 335 // 如果有参数值 336 if ((parameterValues != null) && (parameterValues.Length > 0)) 337 { 338 // 从缓存中加载存储过程参数 339 SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connection, spName); 340 341 // 给存储过程分配参数值 342 AssignParameterValues(commandParameters, parameterValues); 343 344 return ExecuteNonQuery(connection, CommandType.StoredProcedure, spName, commandParameters); 345 } 346 else 347 { 348 return ExecuteNonQuery(connection, CommandType.StoredProcedure, spName); 349 } 350 } 351 352 /// <summary> 353 /// 执行带事务的SqlCommand. 354 /// </summary> 355 /// <remarks> 356 /// 示例.: 357 /// int result = ExecuteNonQuery(trans, CommandType.StoredProcedure, "PublishOrders"); 358 /// </remarks> 359 /// <param name="transaction">一个有效的数据库连接对象</param> 360 /// <param name="commandType">命令类型(存储过程,命令文本或其它.)</param> 361 /// <param name="commandText">存储过程名称或T-SQL语句</param> 362 /// <returns>返回影响的行数/returns> 363 public static int ExecuteNonQuery(SqlTransaction transaction, CommandType commandType, string commandText) 364 { 365 return ExecuteNonQuery(transaction, commandType, commandText, (SqlParameter[])null); 366 } 367 368 /// <summary> 369 /// 执行带事务的SqlCommand(指定参数). 370 /// </summary> 371 /// <remarks> 372 /// 示例: 373 /// int result = ExecuteNonQuery(trans, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 24)); 374 /// </remarks> 375 /// <param name="transaction">一个有效的数据库连接对象</param> 376 /// <param name="commandType">命令类型(存储过程,命令文本或其它.)</param> 377 /// <param name="commandText">存储过程名称或T-SQL语句</param> 378 /// <param name="commandParameters">SqlParamter参数数组</param> 379 /// <returns>返回影响的行数</returns> 380 public static int ExecuteNonQuery(SqlTransaction transaction, CommandType commandType, string commandText, params SqlParameter[] commandParameters) 381 { 382 if (transaction == null) throw new ArgumentNullException("transaction"); 383 if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction"); 384 385 // 预处理 386 SqlCommand cmd = new SqlCommand(); 387 bool mustCloseConnection = false; 388 PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters, out mustCloseConnection); 389 390 // 执行 391 int retval = cmd.ExecuteNonQuery(); 392 393 // 清除参数集,以便再次使用. 394 cmd.Parameters.Clear(); 395 return retval; 396 } 397 398 /// <summary> 399 /// 执行带事务的SqlCommand(指定参数值). 400 /// </summary> 401 /// <remarks> 402 /// 此方法不提供访问存储过程输出参数和返回值 403 /// 示例: 404 /// int result = ExecuteNonQuery(conn, trans, "PublishOrders", 24, 36); 405 /// </remarks> 406 /// <param name="transaction">一个有效的数据库连接对象</param> 407 /// <param name="spName">存储过程名</param> 408 /// <param name="parameterValues">分配给存储过程输入参数的对象数组</param> 409 /// <returns>返回受影响的行数</returns> 410 public static int ExecuteNonQuery(SqlTransaction transaction, string spName, params object[] parameterValues) 411 { 412 if (transaction == null) throw new ArgumentNullException("transaction"); 413 if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction"); 414 if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); 415 416 // 如果有参数值 417 if ((parameterValues != null) && (parameterValues.Length > 0)) 418 { 419 // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. () 420 SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(transaction.Connection, spName); 421 422 // 给存储过程参数赋值 423 AssignParameterValues(commandParameters, parameterValues); 424 425 // 调用重载方法 426 return ExecuteNonQuery(transaction, CommandType.StoredProcedure, spName, commandParameters); 427 } 428 else 429 { 430 // 没有参数值 431 return ExecuteNonQuery(transaction, CommandType.StoredProcedure, spName); 432 } 433 } 434 435 #endregion ExecuteNonQuery方法结束 436 437 #region ExecuteDataset方法 438 439 /// <summary> 440 /// 执行指定数据库连接字符串的命令,返回DataSet. 441 /// </summary> 442 /// <remarks> 443 /// 示例: 444 /// DataSet ds = ExecuteDataset(connString, CommandType.StoredProcedure, "GetOrders"); 445 /// </remarks> 446 /// <param name="connectionString">一个有效的数据库连接字符串</param> 447 /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param> 448 /// <param name="commandText">存储过程名称或T-SQL语句</param> 449 /// <returns>返回一个包含结果集的DataSet</returns> 450 public static DataSet ExecuteDataset(string connectionString, CommandType commandType, string commandText) 451 { 452 return ExecuteDataset(connectionString, commandType, commandText, (SqlParameter[])null); 453 } 454 455 /// <summary> 456 /// 执行指定数据库连接字符串的命令,返回DataSet. 457 /// </summary> 458 /// <remarks> 459 /// 示例: 460 /// DataSet ds = ExecuteDataset(connString, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 24)); 461 /// </remarks> 462 /// <param name="connectionString">一个有效的数据库连接字符串</param> 463 /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param> 464 /// <param name="commandText">存储过程名称或T-SQL语句</param> 465 /// <param name="commandParameters">SqlParamters参数数组</param> 466 /// <returns>返回一个包含结果集的DataSet</returns> 467 public static DataSet ExecuteDataset(string connectionString, CommandType commandType, string commandText, params SqlParameter[] commandParameters) 468 { 469 if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString"); 470 471 // 创建并打开数据库连接对象,操作完成释放对象. 472 using (SqlConnection connection = new SqlConnection(connectionString)) 473 { 474 connection.Open(); 475 476 // 调用指定数据库连接字符串重载方法. 477 return ExecuteDataset(connection, commandType, commandText, commandParameters); 478 } 479 } 480 481 /// <summary> 482 /// 执行指定数据库连接字符串的命令,直接提供参数值,返回DataSet. 483 /// </summary> 484 /// <remarks> 485 /// 此方法不提供访问存储过程输出参数和返回值. 486 /// 示例: 487 /// DataSet ds = ExecuteDataset(connString, "GetOrders", 24, 36); 488 /// </remarks> 489 /// <param name="connectionString">一个有效的数据库连接字符串</param> 490 /// <param name="spName">存储过程名</param> 491 /// <param name="parameterValues">分配给存储过程输入参数的对象数组</param> 492 /// <returns>返回一个包含结果集的DataSet</returns> 493 public static DataSet ExecuteDataset(string connectionString, string spName, params object[] parameterValues) 494 { 495 if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString"); 496 if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); 497 498 if ((parameterValues != null) && (parameterValues.Length > 0)) 499 { 500 // 从缓存中检索存储过程参数 501 SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connectionString, spName); 502 503 // 给存储过程参数分配值 504 AssignParameterValues(commandParameters, parameterValues); 505 506 return ExecuteDataset(connectionString, CommandType.StoredProcedure, spName, commandParameters); 507 } 508 else 509 { 510 return ExecuteDataset(connectionString, CommandType.StoredProcedure, spName); 511 } 512 } 513 514 /// <summary> 515 /// 执行指定数据库连接对象的命令,返回DataSet. 516 /// </summary> 517 /// <remarks> 518 /// 示例: 519 /// DataSet ds = ExecuteDataset(conn, CommandType.StoredProcedure, "GetOrders"); 520 /// </remarks> 521 /// <param name="connection">一个有效的数据库连接对象</param> 522 /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param> 523 /// <param name="commandText">存储过程名或T-SQL语句</param> 524 /// <returns>返回一个包含结果集的DataSet</returns> 525 public static DataSet ExecuteDataset(SqlConnection connection, CommandType commandType, string commandText) 526 { 527 return ExecuteDataset(connection, commandType, commandText, (SqlParameter[])null); 528 } 529 530 /// <summary> 531 /// 执行指定数据库连接对象的命令,指定存储过程参数,返回DataSet. 532 /// </summary> 533 /// <remarks> 534 /// 示例: 535 /// DataSet ds = ExecuteDataset(conn, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 24)); 536 /// </remarks> 537 /// <param name="connection">一个有效的数据库连接对象</param> 538 /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param> 539 /// <param name="commandText">存储过程名或T-SQL语句</param> 540 /// <param name="commandParameters">SqlParamter参数数组</param> 541 /// <returns>返回一个包含结果集的DataSet</returns> 542 public static DataSet ExecuteDataset(SqlConnection connection, CommandType commandType, string commandText, params SqlParameter[] commandParameters) 543 { 544 if (connection == null) throw new ArgumentNullException("connection"); 545 546 // 预处理 547 SqlCommand cmd = new SqlCommand(); 548 bool mustCloseConnection = false; 549 PrepareCommand(cmd, connection, (SqlTransaction)null, commandType, commandText, commandParameters, out mustCloseConnection); 550 551 // 创建SqlDataAdapter和DataSet. 552 using (SqlDataAdapter da = new SqlDataAdapter(cmd)) 553 { 554 DataSet ds = new DataSet(); 555 556 // 填充DataSet. 557 da.Fill(ds); 558 559 cmd.Parameters.Clear(); 560 561 if (mustCloseConnection) 562 connection.Close(); 563 564 return ds; 565 } 566 } 567 568 /// <summary> 569 /// 执行指定数据库连接对象的命令,指定参数值,返回DataSet. 570 /// </summary> 571 /// <remarks> 572 /// 此方法不提供访问存储过程输入参数和返回值. 573 /// 示例.: 574 /// DataSet ds = ExecuteDataset(conn, "GetOrders", 24, 36); 575 /// </remarks> 576 /// <param name="connection">一个有效的数据库连接对象</param> 577 /// <param name="spName">存储过程名</param> 578 /// <param name="parameterValues">分配给存储过程输入参数的对象数组</param> 579 /// <returns>返回一个包含结果集的DataSet</returns> 580 public static DataSet ExecuteDataset(SqlConnection connection, string spName, params object[] parameterValues) 581 { 582 if (connection == null) throw new ArgumentNullException("connection"); 583 if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); 584 585 if ((parameterValues != null) && (parameterValues.Length > 0)) 586 { 587 // 比缓存中加载存储过程参数 588 SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connection, spName); 589 590 // 给存储过程参数分配值 591 AssignParameterValues(commandParameters, parameterValues); 592 593 return ExecuteDataset(connection, CommandType.StoredProcedure, spName, commandParameters); 594 } 595 else 596 { 597 return ExecuteDataset(connection, CommandType.StoredProcedure, spName); 598 } 599 } 600 601 /// <summary> 602 /// 执行指定事务的命令,返回DataSet. 603 /// </summary> 604 /// <remarks> 605 /// 示例: 606 /// DataSet ds = ExecuteDataset(trans, CommandType.StoredProcedure, "GetOrders"); 607 /// </remarks> 608 /// <param name="transaction">事务</param> 609 /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param> 610 /// <param name="commandText">存储过程名或T-SQL语句</param> 611 /// <returns>返回一个包含结果集的DataSet</returns> 612 public static DataSet ExecuteDataset(SqlTransaction transaction, CommandType commandType, string commandText) 613 { 614 return ExecuteDataset(transaction, commandType, commandText, (SqlParameter[])null); 615 } 616 617 /// <summary> 618 /// 执行指定事务的命令,指定参数,返回DataSet. 619 /// </summary> 620 /// <remarks> 621 /// 示例: 622 /// DataSet ds = ExecuteDataset(trans, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 24)); 623 /// </remarks> 624 /// <param name="transaction">事务</param> 625 /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param> 626 /// <param name="commandText">存储过程名或T-SQL语句</param> 627 /// <param name="commandParameters">SqlParamter参数数组</param> 628 /// <returns>返回一个包含结果集的DataSet</returns> 629 public static DataSet ExecuteDataset(SqlTransaction transaction, CommandType commandType, string commandText, params SqlParameter[] commandParameters) 630 { 631 if (transaction == null) throw new ArgumentNullException("transaction"); 632 if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction"); 633 634 // 预处理 635 SqlCommand cmd = new SqlCommand(); 636 bool mustCloseConnection = false; 637 PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters, out mustCloseConnection); 638 639 // 创建 DataAdapter & DataSet 640 using (SqlDataAdapter da = new SqlDataAdapter(cmd)) 641 { 642 DataSet ds = new DataSet(); 643 da.Fill(ds); 644 cmd.Parameters.Clear(); 645 return ds; 646 } 647 } 648 649 /// <summary> 650 /// 执行指定事务的命令,指定参数值,返回DataSet. 651 /// </summary> 652 /// <remarks> 653 /// 此方法不提供访问存储过程输入参数和返回值. 654 /// 示例.: 655 /// DataSet ds = ExecuteDataset(trans, "GetOrders", 24, 36); 656 /// </remarks> 657 /// <param name="transaction">事务</param> 658 /// <param name="spName">存储过程名</param> 659 /// <param name="parameterValues">分配给存储过程输入参数的对象数组</param> 660 /// <returns>返回一个包含结果集的DataSet</returns> 661 public static DataSet ExecuteDataset(SqlTransaction transaction, string spName, params object[] parameterValues) 662 { 663 if (transaction == null) throw new ArgumentNullException("transaction"); 664 if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction"); 665 if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); 666 667 if ((parameterValues != null) && (parameterValues.Length > 0)) 668 { 669 // 从缓存中加载存储过程参数 670 SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(transaction.Connection, spName); 671 672 // 给存储过程参数分配值 673 AssignParameterValues(commandParameters, parameterValues); 674 675 return ExecuteDataset(transaction, CommandType.StoredProcedure, spName, commandParameters); 676 } 677 else 678 { 679 return ExecuteDataset(transaction, CommandType.StoredProcedure, spName); 680 } 681 } 682 683 #endregion ExecuteDataset数据集命令结束 684 685 #region ExecuteReader 数据阅读器 686 687 /// <summary> 688 /// 枚举,标识数据库连接是由SqlHelper提供还是由调用者提供 689 /// </summary> 690 private enum SqlConnectionOwnership 691 { 692 /// <summary>由SqlHelper提供连接</summary> 693 Internal, 694 /// <summary>由调用者提供连接</summary> 695 External 696 } 697 698 /// <summary> 699 /// 执行指定数据库连接对象的数据阅读器. 700 /// </summary> 701 /// <remarks> 702 /// 如果是SqlHelper打开连接,当连接关闭DataReader也将关闭. 703 /// 如果是调用都打开连接,DataReader由调用都管理. 704 /// </remarks> 705 /// <param name="connection">一个有效的数据库连接对象</param> 706 /// <param name="transaction">一个有效的事务,或者为 'null'</param> 707 /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param> 708 /// <param name="commandText">存储过程名或T-SQL语句</param> 709 /// <param name="commandParameters">SqlParameters参数数组,如果没有参数则为'null'</param> 710 /// <param name="connectionOwnership">标识数据库连接对象是由调用者提供还是由SqlHelper提供</param> 711 /// <returns>返回包含结果集的SqlDataReader</returns> 712 private static SqlDataReader ExecuteReader(SqlConnection connection, SqlTransaction transaction, CommandType commandType, string commandText, SqlParameter[] commandParameters, SqlConnectionOwnership connectionOwnership) 713 { 714 if (connection == null) throw new ArgumentNullException("connection"); 715 716 bool mustCloseConnection = false; 717 // 创建命令 718 SqlCommand cmd = new SqlCommand(); 719 try 720 { 721 PrepareCommand(cmd, connection, transaction, commandType, commandText, commandParameters, out mustCloseConnection); 722 723 // 创建数据阅读器 724 SqlDataReader dataReader; 725 726 if (connectionOwnership == SqlConnectionOwnership.External) 727 { 728 dataReader = cmd.ExecuteReader(); 729 } 730 else 731 { 732 dataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection); 733 } 734 735 // 清除参数,以便再次使用.. 736 // HACK: There is a problem here, the output parameter values are fletched 737 // when the reader is closed, so if the parameters are detached from the command 738 // then the SqlReader can磘 set its values. 739 // When this happen, the parameters can磘 be used again in other command. 740 bool canClear = true; 741 foreach (SqlParameter commandParameter in cmd.Parameters) 742 { 743 if (commandParameter.Direction != ParameterDirection.Input) 744 canClear = false; 745 } 746 747 if (canClear) 748 { 749 cmd.Parameters.Clear(); 750 } 751 752 return dataReader; 753 } 754 catch 755 { 756 if (mustCloseConnection) 757 connection.Close(); 758 throw; 759 } 760 } 761 762 /// <summary> 763 /// 执行指定数据库连接字符串的数据阅读器. 764 /// </summary> 765 /// <remarks> 766 /// 示例: 767 /// SqlDataReader dr = ExecuteReader(connString, CommandType.StoredProcedure, "GetOrders"); 768 /// </remarks> 769 /// <param name="connectionString">一个有效的数据库连接字符串</param> 770 /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param> 771 /// <param name="commandText">存储过程名或T-SQL语句</param> 772 /// <returns>返回包含结果集的SqlDataReader</returns> 773 public static SqlDataReader ExecuteReader(string connectionString, CommandType commandType, string commandText) 774 { 775 return ExecuteReader(connectionString, commandType, commandText, (SqlParameter[])null); 776 } 777 778 /// <summary> 779 /// 执行指定数据库连接字符串的数据阅读器,指定参数. 780 /// </summary> 781 /// <remarks> 782 /// 示例: 783 /// SqlDataReader dr = ExecuteReader(connString, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 24)); 784 /// </remarks> 785 /// <param name="connectionString">一个有效的数据库连接字符串</param> 786 /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param> 787 /// <param name="commandText">存储过程名或T-SQL语句</param> 788 /// <param name="commandParameters">SqlParamter参数数组(new SqlParameter("@prodid", 24))</param> 789 /// <returns>返回包含结果集的SqlDataReader</returns> 790 public static SqlDataReader ExecuteReader(string connectionString, CommandType commandType, string commandText, params SqlParameter[] commandParameters) 791 { 792 if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString"); 793 SqlConnection connection = null; 794 try 795 { 796 connection = new SqlConnection(connectionString); 797 connection.Open(); 798 799 return ExecuteReader(connection, null, commandType, commandText, commandParameters, SqlConnectionOwnership.Internal); 800 } 801 catch 802 { 803 // If we fail to return the SqlDatReader, we need to close the connection ourselves 804 if (connection != null) connection.Close(); 805 throw; 806 } 807 808 } 809 810 /// <summary> 811 /// 执行指定数据库连接字符串的数据阅读器,指定参数值. 812 /// </summary> 813 /// <remarks> 814 /// 此方法不提供访问存储过程输出参数和返回值参数. 815 /// 示例: 816 /// SqlDataReader dr = ExecuteReader(connString, "GetOrders", 24, 36); 817 /// </remarks> 818 /// <param name="connectionString">一个有效的数据库连接字符串</param> 819 /// <param name="spName">存储过程名</param> 820 /// <param name="parameterValues">分配给存储过程输入参数的对象数组</param> 821 /// <returns>返回包含结果集的SqlDataReader</returns> 822 public static SqlDataReader ExecuteReader(string connectionString, string spName, params object[] parameterValues) 823 { 824 if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString"); 825 if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); 826 827 if ((parameterValues != null) && (parameterValues.Length > 0)) 828 { 829 SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connectionString, spName); 830 831 AssignParameterValues(commandParameters, parameterValues); 832 833 return ExecuteReader(connectionString, CommandType.StoredProcedure, spName, commandParameters); 834 } 835 else 836 { 837 return ExecuteReader(connectionString, CommandType.StoredProcedure, spName); 838 } 839 } 840 841 /// <summary> 842 /// 执行指定数据库连接对象的数据阅读器. 843 /// </summary> 844 /// <remarks> 845 /// 示例: 846 /// SqlDataReader dr = ExecuteReader(conn, CommandType.StoredProcedure, "GetOrders"); 847 /// </remarks> 848 /// <param name="connection">一个有效的数据库连接对象</param> 849 /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param> 850 /// <param name="commandText">存储过程名或T-SQL语句</param> 851 /// <returns>返回包含结果集的SqlDataReader</returns> 852 public static SqlDataReader ExecuteReader(SqlConnection connection, CommandType commandType, string commandText) 853 { 854 return ExecuteReader(connection, commandType, commandText, (SqlParameter[])null); 855 } 856 857 /// <summary> 858 /// [调用者方式]执行指定数据库连接对象的数据阅读器,指定参数. 859 /// </summary> 860 /// <remarks> 861 /// 示例: 862 /// SqlDataReader dr = ExecuteReader(conn, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 24)); 863 /// </remarks> 864 /// <param name="connection">一个有效的数据库连接对象</param> 865 /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param> 866 /// <param name="commandText">命令类型 (存储过程,命令文本或其它)</param> 867 /// <param name="commandParameters">SqlParamter参数数组</param> 868 /// <returns>返回包含结果集的SqlDataReader</returns> 869 public static SqlDataReader ExecuteReader(SqlConnection connection, CommandType commandType, string commandText, params SqlParameter[] commandParameters) 870 { 871 return ExecuteReader(connection, (SqlTransaction)null, commandType, commandText, commandParameters, SqlConnectionOwnership.External); 872 } 873 874 /// <summary> 875 /// [调用者方式]执行指定数据库连接对象的数据阅读器,指定参数值. 876 /// </summary> 877 /// <remarks> 878 /// 此方法不提供访问存储过程输出参数和返回值参数. 879 /// 示例: 880 /// SqlDataReader dr = ExecuteReader(conn, "GetOrders", 24, 36); 881 /// </remarks> 882 /// <param name="connection">一个有效的数据库连接对象</param> 883 /// <param name="spName">T存储过程名</param> 884 /// <param name="parameterValues">分配给存储过程输入参数的对象数组</param> 885 /// <returns>返回包含结果集的SqlDataReader</returns> 886 public static SqlDataReader ExecuteReader(SqlConnection connection, string spName, params object[] parameterValues) 887 { 888 if (connection == null) throw new ArgumentNullException("connection"); 889 if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); 890 891 if ((parameterValues != null) && (parameterValues.Length > 0)) 892 { 893 SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connection, spName); 894 895 AssignParameterValues(commandParameters, parameterValues); 896 897 return ExecuteReader(connection, CommandType.StoredProcedure, spName, commandParameters); 898 } 899 else 900 { 901 return ExecuteReader(connection, CommandType.StoredProcedure, spName); 902 } 903 } 904 905 /// <summary> 906 /// [调用者方式]执行指定数据库事务的数据阅读器,指定参数值. 907 /// </summary> 908 /// <remarks> 909 /// 示例: 910 /// SqlDataReader dr = ExecuteReader(trans, CommandType.StoredProcedure, "GetOrders"); 911 /// </remarks> 912 /// <param name="transaction">一个有效的连接事务</param> 913 /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param> 914 /// <param name="commandText">存储过程名称或T-SQL语句</param> 915 /// <returns>返回包含结果集的SqlDataReader</returns> 916 public static SqlDataReader ExecuteReader(SqlTransaction transaction, CommandType commandType, string commandText) 917 { 918 return ExecuteReader(transaction, commandType, commandText, (SqlParameter[])null); 919 } 920 921 /// <summary> 922 /// [调用者方式]执行指定数据库事务的数据阅读器,指定参数. 923 /// </summary> 924 /// <remarks> 925 /// 示例: 926 /// SqlDataReader dr = ExecuteReader(trans, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 24)); 927 /// </remarks> 928 /// <param name="transaction">一个有效的连接事务</param> 929 /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param> 930 /// <param name="commandText">存储过程名称或T-SQL语句</param> 931 /// <param name="commandParameters">分配给命令的SqlParamter参数数组</param> 932 /// <returns>返回包含结果集的SqlDataReader</returns> 933 public static SqlDataReader ExecuteReader(SqlTransaction transaction, CommandType commandType, string commandText, params SqlParameter[] commandParameters) 934 { 935 if (transaction == null) throw new ArgumentNullException("transaction"); 936 if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction"); 937 938 return ExecuteReader(transaction.Connection, transaction, commandType, commandText, commandParameters, SqlConnectionOwnership.External); 939 } 940 941 /// <summary> 942 /// [调用者方式]执行指定数据库事务的数据阅读器,指定参数值. 943 /// </summary> 944 /// <remarks> 945 /// 此方法不提供访问存储过程输出参数和返回值参数. 946 /// 947 /// 示例: 948 /// SqlDataReader dr = ExecuteReader(trans, "GetOrders", 24, 36); 949 /// </remarks> 950 /// <param name="transaction">一个有效的连接事务</param> 951 /// <param name="spName">存储过程名称</param> 952 /// <param name="parameterValues">分配给存储过程输入参数的对象数组</param> 953 /// <returns>返回包含结果集的SqlDataReader</returns> 954 public static SqlDataReader ExecuteReader(SqlTransaction transaction, string spName, params object[] parameterValues) 955 { 956 if (transaction == null) throw new ArgumentNullException("transaction"); 957 if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction"); 958 if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); 959 960 // 如果有参数值 961 if ((parameterValues != null) && (parameterValues.Length > 0)) 962 { 963 SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(transaction.Connection, spName); 964 965 AssignParameterValues(commandParameters, parameterValues); 966 967 return ExecuteReader(transaction, CommandType.StoredProcedure, spName, commandParameters); 968 } 969 else 970 { 971 // 没有参数值 972 return ExecuteReader(transaction, CommandType.StoredProcedure, spName); 973 } 974 } 975 976 #endregion ExecuteReader数据阅读器 977 978 #region ExecuteScalar 返回结果集中的第一行第一列 979 980 /// <summary> 981 /// 执行指定数据库连接字符串的命令,返回结果集中的第一行第一列. 982 /// </summary> 983 /// <remarks> 984 /// 示例: 985 /// int orderCount = (int)ExecuteScalar(connString, CommandType.StoredProcedure, "GetOrderCount"); 986 /// </remarks> 987 /// <param name="connectionString">一个有效的数据库连接字符串</param> 988 /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param> 989 /// <param name="commandText">存储过程名称或T-SQL语句</param> 990 /// <returns>返回结果集中的第一行第一列</returns> 991 public static object ExecuteScalar(string connectionString, CommandType commandType, string commandText) 992 { 993 // 执行参数为空的方法 994 return ExecuteScalar(connectionString, commandType, commandText, (SqlParameter[])null); 995 } 996 997 /// <summary> 998 /// 执行指定数据库连接字符串的命令,指定参数,返回结果集中的第一行第一列. 999 /// </summary> 1000 /// <remarks> 1001 /// 示例: 1002 /// int orderCount = (int)ExecuteScalar(connString, CommandType.StoredProcedure, "GetOrderCount", new SqlParameter("@prodid", 24)); 1003 /// </remarks> 1004 /// <param name="connectionString">一个有效的数据库连接字符串</param> 1005 /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param> 1006 /// <param name="commandText">存储过程名称或T-SQL语句</param> 1007 /// <param name="commandParameters">分配给命令的SqlParamter参数数组</param> 1008 /// <returns>返回结果集中的第一行第一列</returns> 1009 public static object ExecuteScalar(string connectionString, CommandType commandType, string commandText, params SqlParameter[] commandParameters) 1010 { 1011 if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString"); 1012 // 创建并打开数据库连接对象,操作完成释放对象. 1013 using (SqlConnection connection = new SqlConnection(connectionString)) 1014 { 1015 connection.Open(); 1016 1017 // 调用指定数据库连接字符串重载方法. 1018 return ExecuteScalar(connection, commandType, commandText, commandParameters); 1019 } 1020 } 1021 1022 /// <summary> 1023 /// 执行指定数据库连接字符串的命令,指定参数值,返回结果集中的第一行第一列. 1024 /// </summary> 1025 /// <remarks> 1026 /// 此方法不提供访问存储过程输出参数和返回值参数. 1027 /// 1028 /// 示例: 1029 /// int orderCount = (int)ExecuteScalar(connString, "GetOrderCount", 24, 36); 1030 /// </remarks> 1031 /// <param name="connectionString">一个有效的数据库连接字符串</param> 1032 /// <param name="spName">存储过程名称</param> 1033 /// <param name="parameterValues">分配给存储过程输入参数的对象数组</param> 1034 /// <returns>返回结果集中的第一行第一列</returns> 1035 public static object ExecuteScalar(string connectionString, string spName, params object[] parameterValues) 1036 { 1037 if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString"); 1038 if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); 1039 1040 // 如果有参数值 1041 if ((parameterValues != null) && (parameterValues.Length > 0)) 1042 { 1043 // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. () 1044 SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connectionString, spName); 1045 1046 // 给存储过程参数赋值 1047 AssignParameterValues(commandParameters, parameterValues); 1048 1049 // 调用重载方法 1050 return ExecuteScalar(connectionString, CommandType.StoredProcedure, spName, commandParameters); 1051 } 1052 else 1053 { 1054 // 没有参数值 1055 return ExecuteScalar(connectionString, CommandType.StoredProcedure, spName); 1056 } 1057 } 1058 1059 /// <summary> 1060 /// 执行指定数据库连接对象的命令,返回结果集中的第一行第一列. 1061 /// </summary> 1062 /// <remarks> 1063 /// 示例: 1064 /// int orderCount = (int)ExecuteScalar(conn, CommandType.StoredProcedure, "GetOrderCount"); 1065 /// </remarks> 1066 /// <param name="connection">一个有效的数据库连接对象</param> 1067 /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param> 1068 /// <param name="commandText">存储过程名称或T-SQL语句</param> 1069 /// <returns>返回结果集中的第一行第一列</returns> 1070 public static object ExecuteScalar(SqlConnection connection, CommandType commandType, string commandText) 1071 { 1072 // 执行参数为空的方法 1073 return ExecuteScalar(connection, commandType, commandText, (SqlParameter[])null); 1074 } 1075 1076 /// <summary> 1077 /// 执行指定数据库连接对象的命令,指定参数,返回结果集中的第一行第一列. 1078 /// </summary> 1079 /// <remarks> 1080 /// 示例: 1081 /// int orderCount = (int)ExecuteScalar(conn, CommandType.StoredProcedure, "GetOrderCount", new SqlParameter("@prodid", 24)); 1082 /// </remarks> 1083 /// <param name="connection">一个有效的数据库连接对象</param> 1084 /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param> 1085 /// <param name="commandText">存储过程名称或T-SQL语句</param> 1086 /// <param name="commandParameters">分配给命令的SqlParamter参数数组</param> 1087 /// <returns>返回结果集中的第一行第一列</returns> 1088 public static object ExecuteScalar(SqlConnection connection, CommandType commandType, string commandText, params SqlParameter[] commandParameters) 1089 { 1090 if (connection == null) throw new ArgumentNullException("connection"); 1091 1092 // 创建SqlCommand命令,并进行预处理 1093 SqlCommand cmd = new SqlCommand(); 1094 1095 bool mustCloseConnection = false; 1096 PrepareCommand(cmd, connection, (SqlTransaction)null, commandType, commandText, commandParameters, out mustCloseConnection); 1097 1098 // 执行SqlCommand命令,并返回结果. 1099 object retval = cmd.ExecuteScalar(); 1100 1101 // 清除参数,以便再次使用. 1102 cmd.Parameters.Clear(); 1103 1104 if (mustCloseConnection) 1105 connection.Close(); 1106 1107 return retval; 1108 } 1109 1110 /// <summary> 1111 /// 执行指定数据库连接对象的命令,指定参数值,返回结果集中的第一行第一列. 1112 /// </summary> 1113 /// <remarks> 1114 /// 此方法不提供访问存储过程输出参数和返回值参数. 1115 /// 1116 /// 示例: 1117 /// int orderCount = (int)ExecuteScalar(conn, "GetOrderCount", 24, 36); 1118 /// </remarks> 1119 /// <param name="connection">一个有效的数据库连接对象</param> 1120 /// <param name="spName">存储过程名称</param> 1121 /// <param name="parameterValues">分配给存储过程输入参数的对象数组</param> 1122 /// <returns>返回结果集中的第一行第一列</returns> 1123 public static object ExecuteScalar(SqlConnection connection, string spName, params object[] parameterValues) 1124 { 1125 if (connection == null) throw new ArgumentNullException("connection"); 1126 if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); 1127 1128 // 如果有参数值 1129 if ((parameterValues != null) && (parameterValues.Length > 0)) 1130 { 1131 // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. () 1132 SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connection, spName); 1133 1134 // 给存储过程参数赋值 1135 AssignParameterValues(commandParameters, parameterValues); 1136 1137 // 调用重载方法 1138 return ExecuteScalar(connection, CommandType.StoredProcedure, spName, commandParameters); 1139 } 1140 else 1141 { 1142 // 没有参数值 1143 return ExecuteScalar(connection, CommandType.StoredProcedure, spName); 1144 } 1145 } 1146 1147 /// <summary> 1148 /// 执行指定数据库事务的命令,返回结果集中的第一行第一列. 1149 /// </summary> 1150 /// <remarks> 1151 /// 示例: 1152 /// int orderCount = (int)ExecuteScalar(trans, CommandType.StoredProcedure, "GetOrderCount"); 1153 /// </remarks> 1154 /// <param name="transaction">一个有效的连接事务</param> 1155 /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param> 1156 /// <param name="commandText">存储过程名称或T-SQL语句</param> 1157 /// <returns>返回结果集中的第一行第一列</returns> 1158 public static object ExecuteScalar(SqlTransaction transaction, CommandType commandType, string commandText) 1159 { 1160 // 执行参数为空的方法 1161 return ExecuteScalar(transaction, commandType, commandText, (SqlParameter[])null); 1162 } 1163 1164 /// <summary> 1165 /// 执行指定数据库事务的命令,指定参数,返回结果集中的第一行第一列. 1166 /// </summary> 1167 /// <remarks> 1168 /// 示例: 1169 /// int orderCount = (int)ExecuteScalar(trans, CommandType.StoredProcedure, "GetOrderCount", new SqlParameter("@prodid", 24)); 1170 /// </remarks> 1171 /// <param name="transaction">一个有效的连接事务</param> 1172 /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param> 1173 /// <param name="commandText">存储过程名称或T-SQL语句</param> 1174 /// <param name="commandParameters">分配给命令的SqlParamter参数数组</param> 1175 /// <returns>返回结果集中的第一行第一列</returns> 1176 public static object ExecuteScalar(SqlTransaction transaction, CommandType commandType, string commandText, params SqlParameter[] commandParameters) 1177 { 1178 if (transaction == null) throw new ArgumentNullException("transaction"); 1179 if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction"); 1180 1181 // 创建SqlCommand命令,并进行预处理 1182 SqlCommand cmd = new SqlCommand(); 1183 bool mustCloseConnection = false; 1184 PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters, out mustCloseConnection); 1185 1186 // 执行SqlCommand命令,并返回结果. 1187 object retval = cmd.ExecuteScalar(); 1188 1189 // 清除参数,以便再次使用. 1190 cmd.Parameters.Clear(); 1191 return retval; 1192 } 1193 1194 /// <summary> 1195 /// 执行指定数据库事务的命令,指定参数值,返回结果集中的第一行第一列. 1196 /// </summary> 1197 /// <remarks> 1198 /// 此方法不提供访问存储过程输出参数和返回值参数. 1199 /// 1200 /// 示例: 1201 /// int orderCount = (int)ExecuteScalar(trans, "GetOrderCount", 24, 36); 1202 /// </remarks> 1203 /// <param name="transaction">一个有效的连接事务</param> 1204 /// <param name="spName">存储过程名称</param> 1205 /// <param name="parameterValues">分配给存储过程输入参数的对象数组</param> 1206 /// <returns>返回结果集中的第一行第一列</returns> 1207 public static object ExecuteScalar(SqlTransaction transaction, string spName, params object[] parameterValues) 1208 { 1209 if (transaction == null) throw new ArgumentNullException("transaction"); 1210 if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction"); 1211 if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); 1212 1213 // 如果有参数值 1214 if ((parameterValues != null) && (parameterValues.Length > 0)) 1215 { 1216 // PPull the parameters for this stored procedure from the parameter cache () 1217 SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(transaction.Connection, spName); 1218 1219 // 给存储过程参数赋值 1220 AssignParameterValues(commandParameters, parameterValues); 1221 1222 // 调用重载方法 1223 return ExecuteScalar(transaction, CommandType.StoredProcedure, spName, commandParameters); 1224 } 1225 else 1226 { 1227 // 没有参数值 1228 return ExecuteScalar(transaction, CommandType.StoredProcedure, spName); 1229 } 1230 } 1231 1232 #endregion ExecuteScalar 1233 1234 #region ExecuteXmlReader XML阅读器 1235 /// <summary> 1236 /// 执行指定数据库连接对象的SqlCommand命令,并产生一个XmlReader对象做为结果集返回. 1237 /// </summary> 1238 /// <remarks> 1239 /// 示例: 1240 /// XmlReader r = ExecuteXmlReader(conn, CommandType.StoredProcedure, "GetOrders"); 1241 /// </remarks> 1242 /// <param name="connection">一个有效的数据库连接对象</param> 1243 /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param> 1244 /// <param name="commandText">存储过程名称或T-SQL语句 using "FOR XML AUTO"</param> 1245 /// <returns>返回XmlReader结果集对象.</returns> 1246 public static XmlReader ExecuteXmlReader(SqlConnection connection, CommandType commandType, string commandText) 1247 { 1248 // 执行参数为空的方法 1249 return ExecuteXmlReader(connection, commandType, commandText, (SqlParameter[])null); 1250 } 1251 1252 /// <summary> 1253 /// 执行指定数据库连接对象的SqlCommand命令,并产生一个XmlReader对象做为结果集返回,指定参数. 1254 /// </summary> 1255 /// <remarks> 1256 /// 示例: 1257 /// XmlReader r = ExecuteXmlReader(conn, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 24)); 1258 /// </remarks> 1259 /// <param name="connection">一个有效的数据库连接对象</param> 1260 /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param> 1261 /// <param name="commandText">存储过程名称或T-SQL语句 using "FOR XML AUTO"</param> 1262 /// <param name="commandParameters">分配给命令的SqlParamter参数数组</param> 1263 /// <returns>返回XmlReader结果集对象.</returns> 1264 public static XmlReader ExecuteXmlReader(SqlConnection connection, CommandType commandType, string commandText, params SqlParameter[] commandParameters) 1265 { 1266 if (connection == null) throw new ArgumentNullException("connection"); 1267 1268 bool mustCloseConnection = false; 1269 // 创建SqlCommand命令,并进行预处理 1270 SqlCommand cmd = new SqlCommand(); 1271 try 1272 { 1273 PrepareCommand(cmd, connection, (SqlTransaction)null, commandType, commandText, commandParameters, out mustCloseConnection); 1274 1275 // 执行命令 1276 XmlReader retval = cmd.ExecuteXmlReader(); 1277 1278 // 清除参数,以便再次使用. 1279 cmd.Parameters.Clear(); 1280 1281 return retval; 1282 } 1283 catch 1284 { 1285 if (mustCloseConnection) 1286 connection.Close(); 1287 throw; 1288 } 1289 } 1290 1291 /// <summary> 1292 /// 执行指定数据库连接对象的SqlCommand命令,并产生一个XmlReader对象做为结果集返回,指定参数值. 1293 /// </summary> 1294 /// <remarks> 1295 /// 此方法不提供访问存储过程输出参数和返回值参数. 1296 /// 1297 /// 示例: 1298 /// XmlReader r = ExecuteXmlReader(conn, "GetOrders", 24, 36); 1299 /// </remarks> 1300 /// <param name="connection">一个有效的数据库连接对象</param> 1301 /// <param name="spName">存储过程名称 using "FOR XML AUTO"</param> 1302 /// <param name="parameterValues">分配给存储过程输入参数的对象数组</param> 1303 /// <returns>返回XmlReader结果集对象.</returns> 1304 public static XmlReader ExecuteXmlReader(SqlConnection connection, string spName, params object[] parameterValues) 1305 { 1306 if (connection == null) throw new ArgumentNullException("connection"); 1307 if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); 1308 1309 // 如果有参数值 1310 if ((parameterValues != null) && (parameterValues.Length > 0)) 1311 { 1312 // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. () 1313 SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connection, spName); 1314 1315 // 给存储过程参数赋值 1316 AssignParameterValues(commandParameters, parameterValues); 1317 1318 // 调用重载方法 1319 return ExecuteXmlReader(connection, CommandType.StoredProcedure, spName, commandParameters); 1320 } 1321 else 1322 { 1323 // 没有参数值 1324 return ExecuteXmlReader(connection, CommandType.StoredProcedure, spName); 1325 } 1326 } 1327 1328 /// <summary> 1329 /// 执行指定数据库事务的SqlCommand命令,并产生一个XmlReader对象做为结果集返回. 1330 /// </summary> 1331 /// <remarks> 1332 /// 示例: 1333 /// XmlReader r = ExecuteXmlReader(trans, CommandType.StoredProcedure, "GetOrders"); 1334 /// </remarks> 1335 /// <param name="transaction">一个有效的连接事务</param> 1336 /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param> 1337 /// <param name="commandText">存储过程名称或T-SQL语句 using "FOR XML AUTO"</param> 1338 /// <returns>返回XmlReader结果集对象.</returns> 1339 public static XmlReader ExecuteXmlReader(SqlTransaction transaction, CommandType commandType, string commandText) 1340 { 1341 // 执行参数为空的方法 1342 return ExecuteXmlReader(transaction, commandType, commandText, (SqlParameter[])null); 1343 } 1344 1345 /// <summary> 1346 /// 执行指定数据库事务的SqlCommand命令,并产生一个XmlReader对象做为结果集返回,指定参数. 1347 /// </summary> 1348 /// <remarks> 1349 /// 示例: 1350 /// XmlReader r = ExecuteXmlReader(trans, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 24)); 1351 /// </remarks> 1352 /// <param name="transaction">一个有效的连接事务</param> 1353 /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param> 1354 /// <param name="commandText">存储过程名称或T-SQL语句 using "FOR XML AUTO"</param> 1355 /// <param name="commandParameters">分配给命令的SqlParamter参数数组</param> 1356 /// <returns>返回XmlReader结果集对象.</returns> 1357 public static XmlReader ExecuteXmlReader(SqlTransaction transaction, CommandType commandType, string commandText, params SqlParameter[] commandParameters) 1358 { 1359 if (transaction == null) throw new ArgumentNullException("transaction"); 1360 if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction"); 1361 1362 // 创建SqlCommand命令,并进行预处理 1363 SqlCommand cmd = new SqlCommand(); 1364 bool mustCloseConnection = false; 1365 PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters, out mustCloseConnection); 1366 1367 // 执行命令 1368 XmlReader retval = cmd.ExecuteXmlReader(); 1369 1370 // 清除参数,以便再次使用. 1371 cmd.Parameters.Clear(); 1372 return retval; 1373 } 1374 1375 /// <summary> 1376 /// 执行指定数据库事务的SqlCommand命令,并产生一个XmlReader对象做为结果集返回,指定参数值. 1377 /// </summary> 1378 /// <remarks> 1379 /// 此方法不提供访问存储过程输出参数和返回值参数. 1380 /// 1381 /// 示例: 1382 /// XmlReader r = ExecuteXmlReader(trans, "GetOrders", 24, 36); 1383 /// </remarks> 1384 /// <param name="transaction">一个有效的连接事务</param> 1385 /// <param name="spName">存储过程名称</param> 1386 /// <param name="parameterValues">分配给存储过程输入参数的对象数组</param> 1387 /// <returns>返回一个包含结果集的DataSet.</returns> 1388 public static XmlReader ExecuteXmlReader(SqlTransaction transaction, string spName, params object[] parameterValues) 1389 { 1390 if (transaction == null) throw new ArgumentNullException("transaction"); 1391 if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction"); 1392 if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); 1393 1394 // 如果有参数值 1395 if ((parameterValues != null) && (parameterValues.Length > 0)) 1396 { 1397 // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. () 1398 SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(transaction.Connection, spName); 1399 1400 // 给存储过程参数赋值 1401 AssignParameterValues(commandParameters, parameterValues); 1402 1403 // 调用重载方法 1404 return ExecuteXmlReader(transaction, CommandType.StoredProcedure, spName, commandParameters); 1405 } 1406 else 1407 { 1408 // 没有参数值 1409 return ExecuteXmlReader(transaction, CommandType.StoredProcedure, spName); 1410 } 1411 } 1412 1413 #endregion ExecuteXmlReader 阅读器结束 1414 1415 #region FillDataset 填充数据集 1416 /// <summary> 1417 /// 执行指定数据库连接字符串的命令,映射数据表并填充数据集. 1418 /// </summary> 1419 /// <remarks> 1420 /// 示例: 1421 /// FillDataset(connString, CommandType.StoredProcedure, "GetOrders", ds, new string[] {"orders"}); 1422 /// </remarks> 1423 /// <param name="connectionString">一个有效的数据库连接字符串</param> 1424 /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param> 1425 /// <param name="commandText">存储过程名称或T-SQL语句</param> 1426 /// <param name="dataSet">要填充结果集的DataSet实例</param> 1427 /// <param name="tableNames">表映射的数据表数组 1428 /// 用户定义的表名 (可有是实际的表名.)</param> 1429 public static void FillDataset(string connectionString, CommandType commandType, string commandText, DataSet dataSet, string[] tableNames) 1430 { 1431 if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString"); 1432 if (dataSet == null) throw new ArgumentNullException("dataSet"); 1433 1434 // 创建并打开数据库连接对象,操作完成释放对象. 1435 using (SqlConnection connection = new SqlConnection(connectionString)) 1436 { 1437 connection.Open(); 1438 1439 // 调用指定数据库连接字符串重载方法. 1440 FillDataset(connection, commandType, commandText, dataSet, tableNames); 1441 } 1442 } 1443 1444 /// <summary> 1445 /// 执行指定数据库连接字符串的命令,映射数据表并填充数据集.指定命令参数. 1446 /// </summary> 1447 /// <remarks> 1448 /// 示例: 1449 /// FillDataset(connString, CommandType.StoredProcedure, "GetOrders", ds, new string[] {"orders"}, new SqlParameter("@prodid", 24)); 1450 /// </remarks> 1451 /// <param name="connectionString">一个有效的数据库连接字符串</param> 1452 /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param> 1453 /// <param name="commandText">存储过程名称或T-SQL语句</param> 1454 /// <param name="commandParameters">分配给命令的SqlParamter参数数组</param> 1455 /// <param name="dataSet">要填充结果集的DataSet实例</param> 1456 /// <param name="tableNames">表映射的数据表数组 1457 /// 用户定义的表名 (可有是实际的表名.) 1458 /// </param> 1459 public static void FillDataset(string connectionString, CommandType commandType, 1460 string commandText, DataSet dataSet, string[] tableNames, 1461 params SqlParameter[] commandParameters) 1462 { 1463 if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString"); 1464 if (dataSet == null) throw new ArgumentNullException("dataSet"); 1465 // 创建并打开数据库连接对象,操作完成释放对象. 1466 using (SqlConnection connection = new SqlConnection(connectionString)) 1467 { 1468 connection.Open(); 1469 1470 // 调用指定数据库连接字符串重载方法. 1471 FillDataset(connection, commandType, commandText, dataSet, tableNames, commandParameters); 1472 } 1473 } 1474 1475 /// <summary> 1476 /// 执行指定数据库连接字符串的命令,映射数据表并填充数据集,指定存储过程参数值. 1477 /// </summary> 1478 /// <remarks> 1479 /// 此方法不提供访问存储过程输出参数和返回值参数. 1480 /// 1481 /// 示例: 1482 /// FillDataset(connString, CommandType.StoredProcedure, "GetOrders", ds, new string[] {"orders"}, 24); 1483 /// </remarks> 1484 /// <param name="connectionString">一个有效的数据库连接字符串</param> 1485 /// <param name="spName">存储过程名称</param> 1486 /// <param name="dataSet">要填充结果集的DataSet实例</param> 1487 /// <param name="tableNames">表映射的数据表数组 1488 /// 用户定义的表名 (可有是实际的表名.) 1489 /// </param> 1490 /// <param name="parameterValues">分配给存储过程输入参数的对象数组</param> 1491 public static void FillDataset(string connectionString, string spName, 1492 DataSet dataSet, string[] tableNames, 1493 params object[] parameterValues) 1494 { 1495 if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString"); 1496 if (dataSet == null) throw new ArgumentNullException("dataSet"); 1497 // 创建并打开数据库连接对象,操作完成释放对象. 1498 using (SqlConnection connection = new SqlConnection(connectionString)) 1499 { 1500 connection.Open(); 1501 1502 // 调用指定数据库连接字符串重载方法. 1503 FillDataset(connection, spName, dataSet, tableNames, parameterValues); 1504 } 1505 } 1506 1507 /// <summary> 1508 /// 执行指定数据库连接对象的命令,映射数据表并填充数据集. 1509 /// </summary> 1510 /// <remarks> 1511 /// 示例: 1512 /// FillDataset(conn, CommandType.StoredProcedure, "GetOrders", ds, new string[] {"orders"}); 1513 /// </remarks> 1514 /// <param name="connection">一个有效的数据库连接对象</param> 1515 /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param> 1516 /// <param name="commandText">存储过程名称或T-SQL语句</param> 1517 /// <param name="dataSet">要填充结果集的DataSet实例</param> 1518 /// <param name="tableNames">表映射的数据表数组 1519 /// 用户定义的表名 (可有是实际的表名.) 1520 /// </param> 1521 public static void FillDataset(SqlConnection connection, CommandType commandType, 1522 string commandText, DataSet dataSet, string[] tableNames) 1523 { 1524 FillDataset(connection, commandType, commandText, dataSet, tableNames, null); 1525 } 1526 1527 /// <summary> 1528 /// 执行指定数据库连接对象的命令,映射数据表并填充数据集,指定参数. 1529 /// </summary> 1530 /// <remarks> 1531 /// 示例: 1532 /// FillDataset(conn, CommandType.StoredProcedure, "GetOrders", ds, new string[] {"orders"}, new SqlParameter("@prodid", 24)); 1533 /// </remarks> 1534 /// <param name="connection">一个有效的数据库连接对象</param> 1535 /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param> 1536 /// <param name="commandText">存储过程名称或T-SQL语句</param> 1537 /// <param name="dataSet">要填充结果集的DataSet实例</param> 1538 /// <param name="tableNames">表映射的数据表数组 1539 /// 用户定义的表名 (可有是实际的表名.) 1540 /// </param> 1541 /// <param name="commandParameters">分配给命令的SqlParamter参数数组</param> 1542 public static void FillDataset(SqlConnection connection, CommandType commandType, 1543 string commandText, DataSet dataSet, string[] tableNames, 1544 params SqlParameter[] commandParameters) 1545 { 1546 FillDataset(connection, null, commandType, commandText, dataSet, tableNames, commandParameters); 1547 } 1548 1549 /// <summary> 1550 /// 执行指定数据库连接对象的命令,映射数据表并填充数据集,指定存储过程参数值. 1551 /// </summary> 1552 /// <remarks> 1553 /// 此方法不提供访问存储过程输出参数和返回值参数. 1554 /// 1555 /// 示例: 1556 /// FillDataset(conn, "GetOrders", ds, new string[] {"orders"}, 24, 36); 1557 /// </remarks> 1558 /// <param name="connection">一个有效的数据库连接对象</param> 1559 /// <param name="spName">存储过程名称</param> 1560 /// <param name="dataSet">要填充结果集的DataSet实例</param> 1561 /// <param name="tableNames">表映射的数据表数组 1562 /// 用户定义的表名 (可有是实际的表名.) 1563 /// </param> 1564 /// <param name="parameterValues">分配给存储过程输入参数的对象数组</param> 1565 public static void FillDataset(SqlConnection connection, string spName, 1566 DataSet dataSet, string[] tableNames, 1567 params object[] parameterValues) 1568 { 1569 if (connection == null) throw new ArgumentNullException("connection"); 1570 if (dataSet == null) throw new ArgumentNullException("dataSet"); 1571 if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); 1572 1573 // 如果有参数值 1574 if ((parameterValues != null) && (parameterValues.Length > 0)) 1575 { 1576 // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. () 1577 SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connection, spName); 1578 1579 // 给存储过程参数赋值 1580 AssignParameterValues(commandParameters, parameterValues); 1581 1582 // 调用重载方法 1583 FillDataset(connection, CommandType.StoredProcedure, spName, dataSet, tableNames, commandParameters); 1584 } 1585 else 1586 { 1587 // 没有参数值 1588 FillDataset(connection, CommandType.StoredProcedure, spName, dataSet, tableNames); 1589 } 1590 } 1591 1592 /// <summary> 1593 /// 执行指定数据库事务的命令,映射数据表并填充数据集. 1594 /// </summary> 1595 /// <remarks> 1596 /// 示例: 1597 /// FillDataset(trans, CommandType.StoredProcedure, "GetOrders", ds, new string[] {"orders"}); 1598 /// </remarks> 1599 /// <param name="transaction">一个有效的连接事务</param> 1600 /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param> 1601 /// <param name="commandText">存储过程名称或T-SQL语句</param> 1602 /// <param name="dataSet">要填充结果集的DataSet实例</param> 1603 /// <param name="tableNames">表映射的数据表数组 1604 /// 用户定义的表名 (可有是实际的表名.) 1605 /// </param> 1606 public static void FillDataset(SqlTransaction transaction, CommandType commandType, 1607 string commandText, 1608 DataSet dataSet, string[] tableNames) 1609 { 1610 FillDataset(transaction, commandType, commandText, dataSet, tableNames, null); 1611 } 1612 1613 /// <summary> 1614 /// 执行指定数据库事务的命令,映射数据表并填充数据集,指定参数. 1615 /// </summary> 1616 /// <remarks> 1617 /// 示例: 1618 /// FillDataset(trans, CommandType.StoredProcedure, "GetOrders", ds, new string[] {"orders"}, new SqlParameter("@prodid", 24)); 1619 /// </remarks> 1620 /// <param name="transaction">一个有效的连接事务</param> 1621 /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param> 1622 /// <param name="commandText">存储过程名称或T-SQL语句</param> 1623 /// <param name="dataSet">要填充结果集的DataSet实例</param> 1624 /// <param name="tableNames">表映射的数据表数组 1625 /// 用户定义的表名 (可有是实际的表名.) 1626 /// </param> 1627 /// <param name="commandParameters">分配给命令的SqlParamter参数数组</param> 1628 public static void FillDataset(SqlTransaction transaction, CommandType commandType, 1629 string commandText, DataSet dataSet, string[] tableNames, 1630 params SqlParameter[] commandParameters) 1631 { 1632 FillDataset(transaction.Connection, transaction, commandType, commandText, dataSet, tableNames, commandParameters); 1633 } 1634 1635 /// <summary> 1636 /// 执行指定数据库事务的命令,映射数据表并填充数据集,指定存储过程参数值. 1637 /// </summary> 1638 /// <remarks> 1639 /// 此方法不提供访问存储过程输出参数和返回值参数. 1640 /// 1641 /// 示例: 1642 /// FillDataset(trans, "GetOrders", ds, new string[]{"orders"}, 24, 36); 1643 /// </remarks> 1644 /// <param name="transaction">一个有效的连接事务</param> 1645 /// <param name="spName">存储过程名称</param> 1646 /// <param name="dataSet">要填充结果集的DataSet实例</param> 1647 /// <param name="tableNames">表映射的数据表数组 1648 /// 用户定义的表名 (可有是实际的表名.) 1649 /// </param> 1650 /// <param name="parameterValues">分配给存储过程输入参数的对象数组</param> 1651 public static void FillDataset(SqlTransaction transaction, string spName, 1652 DataSet dataSet, string[] tableNames, 1653 params object[] parameterValues) 1654 { 1655 if (transaction == null) throw new ArgumentNullException("transaction"); 1656 if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction"); 1657 if (dataSet == null) throw new ArgumentNullException("dataSet"); 1658 if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); 1659 1660 // 如果有参数值 1661 if ((parameterValues != null) && (parameterValues.Length > 0)) 1662 { 1663 // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. () 1664 SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(transaction.Connection, spName); 1665 1666 // 给存储过程参数赋值 1667 AssignParameterValues(commandParameters, parameterValues); 1668 1669 // 调用重载方法 1670 FillDataset(transaction, CommandType.StoredProcedure, spName, dataSet, tableNames, commandParameters); 1671 } 1672 else 1673 { 1674 // 没有参数值 1675 FillDataset(transaction, CommandType.StoredProcedure, spName, dataSet, tableNames); 1676 } 1677 } 1678 1679 /// <summary> 1680 /// [私有方法][内部调用]执行指定数据库连接对象/事务的命令,映射数据表并填充数据集,DataSet/TableNames/SqlParameters. 1681 /// </summary> 1682 /// <remarks> 1683 /// 示例: 1684 /// FillDataset(conn, trans, CommandType.StoredProcedure, "GetOrders", ds, new string[] {"orders"}, new SqlParameter("@prodid", 24)); 1685 /// </remarks> 1686 /// <param name="connection">一个有效的数据库连接对象</param> 1687 /// <param name="transaction">一个有效的连接事务</param> 1688 /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param> 1689 /// <param name="commandText">存储过程名称或T-SQL语句</param> 1690 /// <param name="dataSet">要填充结果集的DataSet实例</param> 1691 /// <param name="tableNames">表映射的数据表数组 1692 /// 用户定义的表名 (可有是实际的表名.) 1693 /// </param> 1694 /// <param name="commandParameters">分配给命令的SqlParamter参数数组</param> 1695 private static void FillDataset(SqlConnection connection, SqlTransaction transaction, CommandType commandType, 1696 string commandText, DataSet dataSet, string[] tableNames, 1697 params SqlParameter[] commandParameters) 1698 { 1699 if (connection == null) throw new ArgumentNullException("connection"); 1700 if (dataSet == null) throw new ArgumentNullException("dataSet"); 1701 1702 // 创建SqlCommand命令,并进行预处理 1703 SqlCommand command = new SqlCommand(); 1704 bool mustCloseConnection = false; 1705 PrepareCommand(command, connection, transaction, commandType, commandText, commandParameters, out mustCloseConnection); 1706 1707 // 执行命令 1708 using (SqlDataAdapter dataAdapter = new SqlDataAdapter(command)) 1709 { 1710 1711 // 追加表映射 1712 if (tableNames != null && tableNames.Length > 0) 1713 { 1714 string tableName = "Table"; 1715 for (int index = 0; index < tableNames.Length; index++) 1716 { 1717 if (tableNames[index] == null || tableNames[index].Length == 0) throw new ArgumentException("The tableNames parameter must contain a list of tables, a value was provided as null or empty string.", "tableNames"); 1718 dataAdapter.TableMappings.Add(tableName, tableNames[index]); 1719 tableName += (index + 1).ToString(); 1720 } 1721 } 1722 1723 // 填充数据集使用默认表名称 1724 dataAdapter.Fill(dataSet); 1725 1726 // 清除参数,以便再次使用. 1727 command.Parameters.Clear(); 1728 } 1729 1730 if (mustCloseConnection) 1731 connection.Close(); 1732 } 1733 #endregion 1734 1735 #region UpdateDataset 更新数据集 1736 /// <summary> 1737 /// 执行数据集更新到数据库,指定inserted, updated, or deleted命令. 1738 /// </summary> 1739 /// <remarks> 1740 /// 示例: 1741 /// UpdateDataset(conn, insertCommand, deleteCommand, updateCommand, dataSet, "Order"); 1742 /// </remarks> 1743 /// <param name="insertCommand">[追加记录]一个有效的T-SQL语句或存储过程</param> 1744 /// <param name="deleteCommand">[删除记录]一个有效的T-SQL语句或存储过程</param> 1745 /// <param name="updateCommand">[更新记录]一个有效的T-SQL语句或存储过程</param> 1746 /// <param name="dataSet">要更新到数据库的DataSet</param> 1747 /// <param name="tableName">要更新到数据库的DataTable</param> 1748 public static void UpdateDataset(SqlCommand insertCommand, SqlCommand deleteCommand, SqlCommand updateCommand, DataSet dataSet, string tableName) 1749 { 1750 if (insertCommand == null) throw new ArgumentNullException("insertCommand"); 1751 if (deleteCommand == null) throw new ArgumentNullException("deleteCommand"); 1752 if (updateCommand == null) throw new ArgumentNullException("updateCommand"); 1753 if (tableName == null || tableName.Length == 0) throw new ArgumentNullException("tableName"); 1754 1755 // 创建SqlDataAdapter,当操作完成后释放. 1756 using (SqlDataAdapter dataAdapter = new SqlDataAdapter()) 1757 { 1758 // 设置数据适配器命令 1759 dataAdapter.UpdateCommand = updateCommand; 1760 dataAdapter.InsertCommand = insertCommand; 1761 dataAdapter.DeleteCommand = deleteCommand; 1762 1763 // 更新数据集改变到数据库 1764 dataAdapter.Update(dataSet, tableName); 1765 1766 // 提交所有改变到数据集. 1767 dataSet.AcceptChanges(); 1768 } 1769 } 1770 #endregion 1771 1772 #region CreateCommand 创建一条SqlCommand命令 1773 /// <summary> 1774 /// 创建SqlCommand命令,指定数据库连接对象,存储过程名和参数. 1775 /// </summary> 1776 /// <remarks> 1777 /// 示例: 1778 /// SqlCommand command = CreateCommand(conn, "AddCustomer", "CustomerID", "CustomerName"); 1779 /// </remarks> 1780 /// <param name="connection">一个有效的数据库连接对象</param> 1781 /// <param name="spName">存储过程名称</param> 1782 /// <param name="sourceColumns">源表的列名称数组</param> 1783 /// <returns>返回SqlCommand命令</returns> 1784 public static SqlCommand CreateCommand(SqlConnection connection, string spName, params string[] sourceColumns) 1785 { 1786 if (connection == null) throw new ArgumentNullException("connection"); 1787 if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); 1788 1789 // 创建命令 1790 SqlCommand cmd = new SqlCommand(spName, connection); 1791 cmd.CommandType = CommandType.StoredProcedure; 1792 1793 // 如果有参数值 1794 if ((sourceColumns != null) && (sourceColumns.Length > 0)) 1795 { 1796 // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. () 1797 SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connection, spName); 1798 1799 // 将源表的列到映射到DataSet命令中. 1800 for (int index = 0; index < sourceColumns.Length; index++) 1801 commandParameters[index].SourceColumn = sourceColumns[index]; 1802 1803 // Attach the discovered parameters to the SqlCommand object 1804 AttachParameters(cmd, commandParameters); 1805 } 1806 1807 return cmd; 1808 } 1809 #endregion 1810 1811 #region ExecuteNonQueryTypedParams 类型化参数(DataRow) 1812 /// <summary> 1813 /// 执行指定连接数据库连接字符串的存储过程,使用DataRow做为参数值,返回受影响的行数. 1814 /// </summary> 1815 /// <param name="connectionString">一个有效的数据库连接字符串</param> 1816 /// <param name="spName">存储过程名称</param> 1817 /// <param name="dataRow">使用DataRow作为参数值</param> 1818 /// <returns>返回影响的行数</returns> 1819 public static int ExecuteNonQueryTypedParams(String connectionString, String spName, DataRow dataRow) 1820 { 1821 if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString"); 1822 if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); 1823 1824 // 如果row有值,存储过程必须初始化. 1825 if (dataRow != null && dataRow.ItemArray.Length > 0) 1826 { 1827 // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. () 1828 SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connectionString, spName); 1829 1830 // 分配参数值 1831 AssignParameterValues(commandParameters, dataRow); 1832 1833 return SqlHelper.ExecuteNonQuery(connectionString, CommandType.StoredProcedure, spName, commandParameters); 1834 } 1835 else 1836 { 1837 return SqlHelper.ExecuteNonQuery(connectionString, CommandType.StoredProcedure, spName); 1838 } 1839 } 1840 1841 /// <summary> 1842 /// 执行指定连接数据库连接对象的存储过程,使用DataRow做为参数值,返回受影响的行数. 1843 /// </summary> 1844 /// <param name="connection">一个有效的数据库连接对象</param> 1845 /// <param name="spName">存储过程名称</param> 1846 /// <param name="dataRow">使用DataRow作为参数值</param> 1847 /// <returns>返回影响的行数</returns> 1848 public static int ExecuteNonQueryTypedParams(SqlConnection connection, String spName, DataRow dataRow) 1849 { 1850 if (connection == null) throw new ArgumentNullException("connection"); 1851 if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); 1852 1853 // 如果row有值,存储过程必须初始化. 1854 if (dataRow != null && dataRow.ItemArray.Length > 0) 1855 { 1856 // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. () 1857 SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connection, spName); 1858 1859 // 分配参数值 1860 AssignParameterValues(commandParameters, dataRow); 1861 1862 return SqlHelper.ExecuteNonQuery(connection, CommandType.StoredProcedure, spName, commandParameters); 1863 } 1864 else 1865 { 1866 return SqlHelper.ExecuteNonQuery(connection, CommandType.StoredProcedure, spName); 1867 } 1868 } 1869 1870 /// <summary> 1871 /// 执行指定连接数据库事物的存储过程,使用DataRow做为参数值,返回受影响的行数. 1872 /// </summary> 1873 /// <param name="transaction">一个有效的连接事务 object</param> 1874 /// <param name="spName">存储过程名称</param> 1875 /// <param name="dataRow">使用DataRow作为参数值</param> 1876 /// <returns>返回影响的行数</returns> 1877 public static int ExecuteNonQueryTypedParams(SqlTransaction transaction, String spName, DataRow dataRow) 1878 { 1879 if (transaction == null) throw new ArgumentNullException("transaction"); 1880 if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction"); 1881 if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); 1882 1883 // Sf the row has values, the store procedure parameters must be initialized 1884 if (dataRow != null && dataRow.ItemArray.Length > 0) 1885 { 1886 // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. () 1887 SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(transaction.Connection, spName); 1888 1889 // 分配参数值 1890 AssignParameterValues(commandParameters, dataRow); 1891 1892 return SqlHelper.ExecuteNonQuery(transaction, CommandType.StoredProcedure, spName, commandParameters); 1893 } 1894 else 1895 { 1896 return SqlHelper.ExecuteNonQuery(transaction, CommandType.StoredProcedure, spName); 1897 } 1898 } 1899 #endregion 1900 1901 #region ExecuteDatasetTypedParams 类型化参数(DataRow) 1902 /// <summary> 1903 /// 执行指定连接数据库连接字符串的存储过程,使用DataRow做为参数值,返回DataSet. 1904 /// </summary> 1905 /// <param name="connectionString">一个有效的数据库连接字符串</param> 1906 /// <param name="spName">存储过程名称</param> 1907 /// <param name="dataRow">使用DataRow作为参数值</param> 1908 /// <returns>返回一个包含结果集的DataSet.</returns> 1909 public static DataSet ExecuteDatasetTypedParams(string connectionString, String spName, DataRow dataRow) 1910 { 1911 if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString"); 1912 if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); 1913 1914 //如果row有值,存储过程必须初始化. 1915 if (dataRow != null && dataRow.ItemArray.Length > 0) 1916 { 1917 // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. () 1918 SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connectionString, spName); 1919 1920 // 分配参数值 1921 AssignParameterValues(commandParameters, dataRow); 1922 1923 return SqlHelper.ExecuteDataset(connectionString, CommandType.StoredProcedure, spName, commandParameters); 1924 } 1925 else 1926 { 1927 return SqlHelper.ExecuteDataset(connectionString, CommandType.StoredProcedure, spName); 1928 } 1929 } 1930 1931 /// <summary> 1932 /// 执行指定连接数据库连接对象的存储过程,使用DataRow做为参数值,返回DataSet. 1933 /// </summary> 1934 /// <param name="connection">一个有效的数据库连接对象</param> 1935 /// <param name="spName">存储过程名称</param> 1936 /// <param name="dataRow">使用DataRow作为参数值</param> 1937 /// <returns>返回一个包含结果集的DataSet.</returns> 1938 /// 1939 public static DataSet ExecuteDatasetTypedParams(SqlConnection connection, String spName, DataRow dataRow) 1940 { 1941 if (connection == null) throw new ArgumentNullException("connection"); 1942 if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); 1943 1944 // 如果row有值,存储过程必须初始化. 1945 if (dataRow != null && dataRow.ItemArray.Length > 0) 1946 { 1947 // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. () 1948 SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connection, spName); 1949 1950 // 分配参数值 1951 AssignParameterValues(commandParameters, dataRow); 1952 1953 return SqlHelper.ExecuteDataset(connection, CommandType.StoredProcedure, spName, commandParameters); 1954 } 1955 else 1956 { 1957 return SqlHelper.ExecuteDataset(connection, CommandType.StoredProcedure, spName); 1958 } 1959 } 1960 1961 /// <summary> 1962 /// 执行指定连接数据库事务的存储过程,使用DataRow做为参数值,返回DataSet. 1963 /// </summary> 1964 /// <param name="transaction">一个有效的连接事务 object</param> 1965 /// <param name="spName">存储过程名称</param> 1966 /// <param name="dataRow">使用DataRow作为参数值</param> 1967 /// <returns>返回一个包含结果集的DataSet.</returns> 1968 public static DataSet ExecuteDatasetTypedParams(SqlTransaction transaction, String spName, DataRow dataRow) 1969 { 1970 if (transaction == null) throw new ArgumentNullException("transaction"); 1971 if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction"); 1972 if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); 1973 1974 // 如果row有值,存储过程必须初始化. 1975 if (dataRow != null && dataRow.ItemArray.Length > 0) 1976 { 1977 // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. () 1978 SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(transaction.Connection, spName); 1979 1980 // 分配参数值 1981 AssignParameterValues(commandParameters, dataRow); 1982 1983 return SqlHelper.ExecuteDataset(transaction, CommandType.StoredProcedure, spName, commandParameters); 1984 } 1985 else 1986 { 1987 return SqlHelper.ExecuteDataset(transaction, CommandType.StoredProcedure, spName); 1988 } 1989 } 1990 1991 #endregion 1992 1993 #region ExecuteReaderTypedParams 类型化参数(DataRow) 1994 /// <summary> 1995 /// 执行指定连接数据库连接字符串的存储过程,使用DataRow做为参数值,返回DataReader. 1996 /// </summary> 1997 /// <param name="connectionString">一个有效的数据库连接字符串</param> 1998 /// <param name="spName">存储过程名称</param> 1999 /// <param name="dataRow">使用DataRow作为参数值</param> 2000 /// <returns>返回包含结果集的SqlDataReader</returns> 2001 public static SqlDataReader ExecuteReaderTypedParams(String connectionString, String spName, DataRow dataRow) 2002 { 2003 if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString"); 2004 if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); 2005 2006 // 如果row有值,存储过程必须初始化. 2007 if (dataRow != null && dataRow.ItemArray.Length > 0) 2008 { 2009 // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. () 2010 SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connectionString, spName); 2011 2012 // 分配参数值 2013 AssignParameterValues(commandParameters, dataRow); 2014 2015 return SqlHelper.ExecuteReader(connectionString, CommandType.StoredProcedure, spName, commandParameters); 2016 } 2017 else 2018 { 2019 return SqlHelper.ExecuteReader(connectionString, CommandType.StoredProcedure, spName); 2020 } 2021 } 2022 2023 2024 /// <summary> 2025 /// 执行指定连接数据库连接对象的存储过程,使用DataRow做为参数值,返回DataReader. 2026 /// </summary> 2027 /// <param name="connection">一个有效的数据库连接对象</param> 2028 /// <param name="spName">存储过程名称</param> 2029 /// <param name="dataRow">使用DataRow作为参数值</param> 2030 /// <returns>返回包含结果集的SqlDataReader</returns> 2031 public static SqlDataReader ExecuteReaderTypedParams(SqlConnection connection, String spName, DataRow dataRow) 2032 { 2033 if (connection == null) throw new ArgumentNullException("connection"); 2034 if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); 2035 2036 // 如果row有值,存储过程必须初始化. 2037 if (dataRow != null && dataRow.ItemArray.Length > 0) 2038 { 2039 // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. () 2040 SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connection, spName); 2041 2042 // 分配参数值 2043 AssignParameterValues(commandParameters, dataRow); 2044 2045 return SqlHelper.ExecuteReader(connection, CommandType.StoredProcedure, spName, commandParameters); 2046 } 2047 else 2048 { 2049 return SqlHelper.ExecuteReader(connection, CommandType.StoredProcedure, spName); 2050 } 2051 } 2052 2053 /// <summary> 2054 /// 执行指定连接数据库事物的存储过程,使用DataRow做为参数值,返回DataReader. 2055 /// </summary> 2056 /// <param name="transaction">一个有效的连接事务 object</param> 2057 /// <param name="spName">存储过程名称</param> 2058 /// <param name="dataRow">使用DataRow作为参数值</param> 2059 /// <returns>返回包含结果集的SqlDataReader</returns> 2060 public static SqlDataReader ExecuteReaderTypedParams(SqlTransaction transaction, String spName, DataRow dataRow) 2061 { 2062 if (transaction == null) throw new ArgumentNullException("transaction"); 2063 if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction"); 2064 if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); 2065 2066 // 如果row有值,存储过程必须初始化. 2067 if (dataRow != null && dataRow.ItemArray.Length > 0) 2068 { 2069 // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. () 2070 SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(transaction.Connection, spName); 2071 2072 // 分配参数值 2073 AssignParameterValues(commandParameters, dataRow); 2074 2075 return SqlHelper.ExecuteReader(transaction, CommandType.StoredProcedure, spName, commandParameters); 2076 } 2077 else 2078 { 2079 return SqlHelper.ExecuteReader(transaction, CommandType.StoredProcedure, spName); 2080 } 2081 } 2082 #endregion 2083 2084 #region ExecuteScalarTypedParams 类型化参数(DataRow) 2085 /// <summary> 2086 /// 执行指定连接数据库连接字符串的存储过程,使用DataRow做为参数值,返回结果集中的第一行第一列. 2087 /// </summary> 2088 /// <param name="connectionString">一个有效的数据库连接字符串</param> 2089 /// <param name="spName">存储过程名称</param> 2090 /// <param name="dataRow">使用DataRow作为参数值</param> 2091 /// <returns>返回结果集中的第一行第一列</returns> 2092 public static object ExecuteScalarTypedParams(String connectionString, String spName, DataRow dataRow) 2093 { 2094 if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString"); 2095 if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); 2096 2097 // 如果row有值,存储过程必须初始化. 2098 if (dataRow != null && dataRow.ItemArray.Length > 0) 2099 { 2100 // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. () 2101 SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connectionString, spName); 2102 2103 // 分配参数值 2104 AssignParameterValues(commandParameters, dataRow); 2105 2106 return SqlHelper.ExecuteScalar(connectionString, CommandType.StoredProcedure, spName, commandParameters); 2107 } 2108 else 2109 { 2110 return SqlHelper.ExecuteScalar(connectionString, CommandType.StoredProcedure, spName); 2111 } 2112 } 2113 2114 /// <summary> 2115 /// 执行指定连接数据库连接对象的存储过程,使用DataRow做为参数值,返回结果集中的第一行第一列. 2116 /// </summary> 2117 /// <param name="connection">一个有效的数据库连接对象</param> 2118 /// <param name="spName">存储过程名称</param> 2119 /// <param name="dataRow">使用DataRow作为参数值</param> 2120 /// <returns>返回结果集中的第一行第一列</returns> 2121 public static object ExecuteScalarTypedParams(SqlConnection connection, String spName, DataRow dataRow) 2122 { 2123 if (connection == null) throw new ArgumentNullException("connection"); 2124 if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); 2125 2126 // 如果row有值,存储过程必须初始化. 2127 if (dataRow != null && dataRow.ItemArray.Length > 0) 2128 { 2129 // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. () 2130 SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connection, spName); 2131 2132 // 分配参数值 2133 AssignParameterValues(commandParameters, dataRow); 2134 2135 return SqlHelper.ExecuteScalar(connection, CommandType.StoredProcedure, spName, commandParameters); 2136 } 2137 else 2138 { 2139 return SqlHelper.ExecuteScalar(connection, CommandType.StoredProcedure, spName); 2140 } 2141 } 2142 2143 /// <summary> 2144 /// 执行指定连接数据库事务的存储过程,使用DataRow做为参数值,返回结果集中的第一行第一列. 2145 /// </summary> 2146 /// <param name="transaction">一个有效的连接事务 object</param> 2147 /// <param name="spName">存储过程名称</param> 2148 /// <param name="dataRow">使用DataRow作为参数值</param> 2149 /// <returns>返回结果集中的第一行第一列</returns> 2150 public static object ExecuteScalarTypedParams(SqlTransaction transaction, String spName, DataRow dataRow) 2151 { 2152 if (transaction == null) throw new ArgumentNullException("transaction"); 2153 if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction"); 2154 if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); 2155 2156 // 如果row有值,存储过程必须初始化. 2157 if (dataRow != null && dataRow.ItemArray.Length > 0) 2158 { 2159 // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. () 2160 SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(transaction.Connection, spName); 2161 2162 // 分配参数值 2163 AssignParameterValues(commandParameters, dataRow); 2164 2165 return SqlHelper.ExecuteScalar(transaction, CommandType.StoredProcedure, spName, commandParameters); 2166 } 2167 else 2168 { 2169 return SqlHelper.ExecuteScalar(transaction, CommandType.StoredProcedure, spName); 2170 } 2171 } 2172 #endregion 2173 2174 #region ExecuteXmlReaderTypedParams 类型化参数(DataRow) 2175 /// <summary> 2176 /// 执行指定连接数据库连接对象的存储过程,使用DataRow做为参数值,返回XmlReader类型的结果集. 2177 /// </summary> 2178 /// <param name="connection">一个有效的数据库连接对象</param> 2179 /// <param name="spName">存储过程名称</param> 2180 /// <param name="dataRow">使用DataRow作为参数值</param> 2181 /// <returns>返回XmlReader结果集对象.</returns> 2182 public static XmlReader ExecuteXmlReaderTypedParams(SqlConnection connection, String spName, DataRow dataRow) 2183 { 2184 if (connection == null) throw new ArgumentNullException("connection"); 2185 if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); 2186 2187 // 如果row有值,存储过程必须初始化. 2188 if (dataRow != null && dataRow.ItemArray.Length > 0) 2189 { 2190 // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. () 2191 SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connection, spName); 2192 2193 // 分配参数值 2194 AssignParameterValues(commandParameters, dataRow); 2195 2196 return SqlHelper.ExecuteXmlReader(connection, CommandType.StoredProcedure, spName, commandParameters); 2197 } 2198 else 2199 { 2200 return SqlHelper.ExecuteXmlReader(connection, CommandType.StoredProcedure, spName); 2201 } 2202 } 2203 2204 /// <summary> 2205 /// 执行指定连接数据库事务的存储过程,使用DataRow做为参数值,返回XmlReader类型的结果集. 2206 /// </summary> 2207 /// <param name="transaction">一个有效的连接事务 object</param> 2208 /// <param name="spName">存储过程名称</param> 2209 /// <param name="dataRow">使用DataRow作为参数值</param> 2210 /// <returns>返回XmlReader结果集对象.</returns> 2211 public static XmlReader ExecuteXmlReaderTypedParams(SqlTransaction transaction, String spName, DataRow dataRow) 2212 { 2213 if (transaction == null) throw new ArgumentNullException("transaction"); 2214 if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction"); 2215 if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); 2216 2217 // 如果row有值,存储过程必须初始化. 2218 if (dataRow != null && dataRow.ItemArray.Length > 0) 2219 { 2220 // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. () 2221 SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(transaction.Connection, spName); 2222 2223 // 分配参数值 2224 AssignParameterValues(commandParameters, dataRow); 2225 2226 return SqlHelper.ExecuteXmlReader(transaction, CommandType.StoredProcedure, spName, commandParameters); 2227 } 2228 else 2229 { 2230 return SqlHelper.ExecuteXmlReader(transaction, CommandType.StoredProcedure, spName); 2231 } 2232 } 2233 #endregion 2234 2235 } 2236 2237 /// <summary> 2238 /// SqlHelperParameterCache提供缓存存储过程参数,并能够在运行时从存储过程中探索参数. 2239 /// </summary> 2240 public sealed class SqlHelperParameterCache 2241 { 2242 #region 私有方法,字段,构造函数 2243 // 私有构造函数,妨止类被实例化. 2244 private SqlHelperParameterCache() { } 2245 2246 // 这个方法要注意 2247 private static Hashtable paramCache = Hashtable.Synchronized(new Hashtable()); 2248 2249 /// <summary> 2250 /// 探索运行时的存储过程,返回SqlParameter参数数组. 2251 /// 初始化参数值为 DBNull.Value. 2252 /// </summary> 2253 /// <param name="connection">一个有效的数据库连接</param> 2254 /// <param name="spName">存储过程名称</param> 2255 /// <param name="includeReturnValueParameter">是否包含返回值参数</param> 2256 /// <returns>返回SqlParameter参数数组</returns> 2257 private static SqlParameter[] DiscoverSpParameterSet(SqlConnection connection, string spName, bool includeReturnValueParameter) 2258 { 2259 if (connection == null) throw new ArgumentNullException("connection"); 2260 if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); 2261 2262 SqlCommand cmd = new SqlCommand(spName, connection); 2263 cmd.CommandType = CommandType.StoredProcedure; 2264 2265 connection.Open(); 2266 // 检索cmd指定的存储过程的参数信息,并填充到cmd的Parameters参数集中. 2267 SqlCommandBuilder.DeriveParameters(cmd); 2268 connection.Close(); 2269 // 如果不包含返回值参数,将参数集中的每一个参数删除. 2270 if (!includeReturnValueParameter) 2271 { 2272 cmd.Parameters.RemoveAt(0); 2273 } 2274 2275 // 创建参数数组 2276 SqlParameter[] discoveredParameters = new SqlParameter[cmd.Parameters.Count]; 2277 // 将cmd的Parameters参数集复制到discoveredParameters数组. 2278 cmd.Parameters.CopyTo(discoveredParameters, 0); 2279 2280 // 初始化参数值为 DBNull.Value. 2281 foreach (SqlParameter discoveredParameter in discoveredParameters) 2282 { 2283 discoveredParameter.Value = DBNull.Value; 2284 } 2285 return discoveredParameters; 2286 } 2287 2288 /// <summary> 2289 /// SqlParameter参数数组的深层拷贝. 2290 /// </summary> 2291 /// <param name="originalParameters">原始参数数组</param> 2292 /// <returns>返回一个同样的参数数组</returns> 2293 private static SqlParameter[] CloneParameters(SqlParameter[] originalParameters) 2294 { 2295 SqlParameter[] clonedParameters = new SqlParameter[originalParameters.Length]; 2296 2297 for (int i = 0, j = originalParameters.Length; i < j; i++) 2298 { 2299 clonedParameters[i] = (SqlParameter)((ICloneable)originalParameters[i]).Clone(); 2300 } 2301 2302 return clonedParameters; 2303 } 2304 2305 #endregion 私有方法,字段,构造函数结束 2306 2307 #region 缓存方法 2308 2309 /// <summary> 2310 /// 追加参数数组到缓存. 2311 /// </summary> 2312 /// <param name="connectionString">一个有效的数据库连接字符串</param> 2313 /// <param name="commandText">存储过程名或SQL语句</param> 2314 /// <param name="commandParameters">要缓存的参数数组</param> 2315 public static void CacheParameterSet(string connectionString, string commandText, params SqlParameter[] commandParameters) 2316 { 2317 if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString"); 2318 if (commandText == null || commandText.Length == 0) throw new ArgumentNullException("commandText"); 2319 2320 string hashKey = connectionString + ":" + commandText; 2321 2322 paramCache[hashKey] = commandParameters; 2323 } 2324 2325 /// <summary> 2326 /// 从缓存中获取参数数组. 2327 /// </summary> 2328 /// <param name="connectionString">一个有效的数据库连接字符</param> 2329 /// <param name="commandText">存储过程名或SQL语句</param> 2330 /// <returns>参数数组</returns> 2331 public static SqlParameter[] GetCachedParameterSet(string connectionString, string commandText) 2332 { 2333 if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString"); 2334 if (commandText == null || commandText.Length == 0) throw new ArgumentNullException("commandText"); 2335 2336 string hashKey = connectionString + ":" + commandText; 2337 2338 SqlParameter[] cachedParameters = paramCache[hashKey] as SqlParameter[]; 2339 if (cachedParameters == null) 2340 { 2341 return null; 2342 } 2343 else 2344 { 2345 return CloneParameters(cachedParameters); 2346 } 2347 } 2348 2349 #endregion 缓存方法结束 2350 2351 #region 检索指定的存储过程的参数集 2352 2353 /// <summary> 2354 /// 返回指定的存储过程的参数集 2355 /// </summary> 2356 /// <remarks> 2357 /// 这个方法将查询数据库,并将信息存储到缓存. 2358 /// </remarks> 2359 /// <param name="connectionString">一个有效的数据库连接字符</param> 2360 /// <param name="spName">存储过程名</param> 2361 /// <returns>返回SqlParameter参数数组</returns> 2362 public static SqlParameter[] GetSpParameterSet(string connectionString, string spName) 2363 { 2364 return GetSpParameterSet(connectionString, spName, false); 2365 } 2366 2367 /// <summary> 2368 /// 返回指定的存储过程的参数集 2369 /// </summary> 2370 /// <remarks> 2371 /// 这个方法将查询数据库,并将信息存储到缓存. 2372 /// </remarks> 2373 /// <param name="connectionString">一个有效的数据库连接字符.</param> 2374 /// <param name="spName">存储过程名</param> 2375 /// <param name="includeReturnValueParameter">是否包含返回值参数</param> 2376 /// <returns>返回SqlParameter参数数组</returns> 2377 public static SqlParameter[] GetSpParameterSet(string connectionString, string spName, bool includeReturnValueParameter) 2378 { 2379 if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString"); 2380 if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); 2381 2382 using (SqlConnection connection = new SqlConnection(connectionString)) 2383 { 2384 return GetSpParameterSetInternal(connection, spName, includeReturnValueParameter); 2385 } 2386 } 2387 2388 /// <summary> 2389 /// [内部]返回指定的存储过程的参数集(使用连接对象). 2390 /// </summary> 2391 /// <remarks> 2392 /// 这个方法将查询数据库,并将信息存储到缓存. 2393 /// </remarks> 2394 /// <param name="connection">一个有效的数据库连接字符</param> 2395 /// <param name="spName">存储过程名</param> 2396 /// <returns>返回SqlParameter参数数组</returns> 2397 internal static SqlParameter[] GetSpParameterSet(SqlConnection connection, string spName) 2398 { 2399 return GetSpParameterSet(connection, spName, false); 2400 } 2401 2402 /// <summary> 2403 /// [内部]返回指定的存储过程的参数集(使用连接对象) 2404 /// </summary> 2405 /// <remarks> 2406 /// 这个方法将查询数据库,并将信息存储到缓存. 2407 /// </remarks> 2408 /// <param name="connection">一个有效的数据库连接对象</param> 2409 /// <param name="spName">存储过程名</param> 2410 /// <param name="includeReturnValueParameter"> 2411 /// 是否包含返回值参数 2412 /// </param> 2413 /// <returns>返回SqlParameter参数数组</returns> 2414 internal static SqlParameter[] GetSpParameterSet(SqlConnection connection, string spName, bool includeReturnValueParameter) 2415 { 2416 if (connection == null) throw new ArgumentNullException("connection"); 2417 using (SqlConnection clonedConnection = (SqlConnection)((ICloneable)connection).Clone()) 2418 { 2419 return GetSpParameterSetInternal(clonedConnection, spName, includeReturnValueParameter); 2420 } 2421 } 2422 2423 /// <summary> 2424 /// [私有]返回指定的存储过程的参数集(使用连接对象) 2425 /// </summary> 2426 /// <param name="connection">一个有效的数据库连接对象</param> 2427 /// <param name="spName">存储过程名</param> 2428 /// <param name="includeReturnValueParameter">是否包含返回值参数</param> 2429 /// <returns>返回SqlParameter参数数组</returns> 2430 private static SqlParameter[] GetSpParameterSetInternal(SqlConnection connection, string spName, bool includeReturnValueParameter) 2431 { 2432 if (connection == null) throw new ArgumentNullException("connection"); 2433 if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); 2434 2435 string hashKey = connection.ConnectionString + ":" + spName + (includeReturnValueParameter ? ":include ReturnValue Parameter" : ""); 2436 2437 SqlParameter[] cachedParameters; 2438 2439 cachedParameters = paramCache[hashKey] as SqlParameter[]; 2440 if (cachedParameters == null) 2441 { 2442 SqlParameter[] spParameters = DiscoverSpParameterSet(connection, spName, includeReturnValueParameter); 2443 paramCache[hashKey] = spParameters; 2444 cachedParameters = spParameters; 2445 } 2446 2447 return CloneParameters(cachedParameters); 2448 } 2449 2450 #endregion 参数集检索结束 2451 2452 } 2453 }