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