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