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