1 using System; 2 using System.Collections; 3 using System.Collections.Specialized; 4 using System.Data; 5 using System.Data.SqlClient; 6 using System.Configuration; 7 using System.Text; 8 9 namespace IFACE.DBUtility 10 { 11 /// <summary> 12 /// 数据访问抽象基础类 13 /// Copyright (C) 2004-2008 LiTianPing 14 /// Enterprise Library 2.0 数据访问进一步封装类 15 /// All rights reserved 16 /// </summary> 17 public abstract class DbHelperSQL 18 { 19 //数据库连接字符串(web.config来配置) 20 public static string connectionString = ConfigurationSettings.AppSettings["ConnectionString"]; 21 22 public DbHelperSQL() 23 { 24 } 25 private static SqlConnection GetConn() 26 { 27 SqlConnection conn = new SqlConnection(connectionString); 28 return conn; 29 } 30 /// <summary> 31 /// 执行多次提交的sql数组对象 32 /// </summary> 33 /// <param name="sqlStr">数组对象</param> 34 /// <param name="len">有效长度</param> 35 /// <returns>bool</returns> 36 public static bool ExecuteOrcSqlStr(ArrayList arrSql, out string strErr) 37 { 38 strErr = ""; 39 bool result = false; 40 SqlConnection con = GetConn(); 41 if (con.State != ConnectionState.Open) 42 { 43 con.Open(); 44 } 45 SqlCommand ocmd; 46 ocmd = con.CreateCommand(); 47 48 SqlTransaction trans; 49 trans = con.BeginTransaction(IsolationLevel.ReadCommitted); 50 ocmd.Transaction = trans; 51 52 try 53 { 54 for (int i = 0; i < arrSql.Count; i++) 55 { 56 if (arrSql[i].ToString().Trim() != "") 57 { 58 ocmd.CommandText = arrSql[i].ToString(); 59 ocmd.ExecuteNonQuery(); 60 } 61 } 62 trans.Commit(); 63 result = true; 64 } 65 catch (Exception err) 66 { 67 strErr = err.ToString() + ocmd.CommandText; 68 trans.Rollback(); 69 } 70 finally 71 { 72 con.Close(); 73 con.Dispose(); 74 } 75 return result; 76 } 77 #region 公用方法 78 public static int GetMaxID(string FieldName, string TableName) 79 { 80 string strsql = "select max(" + FieldName + ")+1 from " + TableName; 81 object obj = DbHelperSQL.GetSingle(strsql); 82 if (obj == null) 83 { 84 return 1; 85 } 86 else 87 { 88 return int.Parse(obj.ToString()); 89 } 90 } 91 public static bool Exists(string strSql) 92 { 93 object obj = DbHelperSQL.GetSingle(strSql); 94 int cmdresult; 95 if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value))) 96 { 97 cmdresult = 0; 98 } 99 else 100 { 101 cmdresult = int.Parse(obj.ToString()); 102 } 103 if (cmdresult == 0) 104 { 105 return false; 106 } 107 else 108 { 109 return true; 110 } 111 } 112 public static bool Exists(string strSql, params SqlParameter[] cmdParms) 113 { 114 object obj = DbHelperSQL.GetSingle(strSql, cmdParms); 115 int cmdresult; 116 if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value))) 117 { 118 cmdresult = 0; 119 } 120 else 121 { 122 cmdresult = int.Parse(obj.ToString()); 123 } 124 if (cmdresult == 0) 125 { 126 return false; 127 } 128 else 129 { 130 return true; 131 } 132 } 133 #endregion 134 135 #region 执行简单SQL语句 136 /// <summary> 137 /// 执行SQL语句,返回影响的记录数 138 /// </summary> 139 /// <param name="SQLString">SQL语句</param> 140 /// <returns>影响的记录数</returns> 141 public static int ExecuteSql(string SQLString) 142 { 143 using (SqlConnection connection = new SqlConnection(connectionString)) 144 { 145 using (SqlCommand cmd = new SqlCommand(SQLString, connection)) 146 { 147 try 148 { 149 connection.Open(); 150 int rows = cmd.ExecuteNonQuery(); 151 return rows; 152 } 153 catch (System.Data.SqlClient.SqlException E) 154 { 155 156 throw new Exception(E.Message); 157 } 158 finally 159 { 160 connection.Close(); 161 } 162 } 163 } 164 } 165 /// <summary> 166 /// 执行SQL语句,设置命令的执行等待时间 167 /// </summary> 168 /// <param name="SQLString"></param> 169 /// <param name="Times"></param> 170 /// <returns></returns> 171 public static int ExecuteSqlByTime(string SQLString, int Times) 172 { 173 using (SqlConnection connection = new SqlConnection(connectionString)) 174 { 175 using (SqlCommand cmd = new SqlCommand(SQLString, connection)) 176 { 177 try 178 { 179 connection.Open(); 180 cmd.CommandTimeout = Times; 181 int rows = cmd.ExecuteNonQuery(); 182 return rows; 183 } 184 catch (System.Data.SqlClient.SqlException E) 185 { 186 187 throw new Exception(E.Message); 188 } 189 finally 190 { 191 connection.Close(); 192 } 193 } 194 } 195 } 196 197 /// <summary> 198 /// 执行多条SQL语句,实现数据库事务。 199 /// </summary> 200 /// <param name="SQLStringList">多条SQL语句</param> 201 public static void ExecuteSqlTran(ArrayList SQLStringList) 202 { 203 using (SqlConnection conn = new SqlConnection(connectionString)) 204 { 205 conn.Open(); 206 SqlCommand cmd = new SqlCommand(); 207 cmd.Connection = conn; 208 SqlTransaction tx = conn.BeginTransaction(); 209 cmd.Transaction = tx; 210 string strsql = ""; 211 try 212 { 213 for (int n = 0; n < SQLStringList.Count; n++) 214 { 215 strsql = SQLStringList[n].ToString(); 216 if (strsql.Trim().Length > 1) 217 { 218 cmd.CommandText = strsql; 219 cmd.ExecuteNonQuery(); 220 } 221 } 222 tx.Commit(); 223 } 224 catch (System.Data.SqlClient.SqlException E) 225 { 226 tx.Rollback(); 227 throw new Exception(E.Message + " " + strsql); 228 } 229 finally 230 { 231 conn.Close(); 232 } 233 } 234 } 235 236 /// <summary> 237 /// 执行多条SQL语句,实现数据库事务。 238 /// </summary> 239 /// <param name="SQLString">多条SQL语句组成的字符串</param> 240 public static void ExecuteSqlTran(StringBuilder SQLString) 241 { 242 using (SqlConnection conn = new SqlConnection(connectionString)) 243 { 244 conn.Open(); 245 SqlCommand cmd = new SqlCommand(); 246 cmd.Connection = conn; 247 SqlTransaction tx = conn.BeginTransaction(); 248 cmd.Transaction = tx; 249 string strsql = ""; 250 try 251 { 252 253 strsql = SQLString.ToString(); 254 if (strsql.Trim().Length > 1) 255 { 256 cmd.CommandText = strsql; 257 cmd.ExecuteNonQuery(); 258 } 259 tx.Commit(); 260 } 261 catch (System.Data.SqlClient.SqlException E) 262 { 263 tx.Rollback(); 264 throw new Exception(E.Message + " " + strsql); 265 } 266 finally 267 { 268 conn.Close(); 269 } 270 } 271 } 272 273 274 /// <summary> 275 /// 执行带一个存储过程参数的的SQL语句。 276 /// </summary> 277 /// <param name="SQLString">SQL语句</param> 278 /// <param name="content">参数内容,比如一个字段是格式复杂的文章,有特殊符号,可以通过这个方式新增</param> 279 /// <returns>影响的记录数</returns> 280 public static int ExecuteSql(string SQLString, string content) 281 { 282 using (SqlConnection connection = new SqlConnection(connectionString)) 283 { 284 SqlCommand cmd = new SqlCommand(SQLString, connection); 285 System.Data.SqlClient.SqlParameter myParameter = new System.Data.SqlClient.SqlParameter("@content", SqlDbType.NText); 286 myParameter.Value = content; 287 cmd.Parameters.Add(myParameter); 288 try 289 { 290 connection.Open(); 291 int rows = cmd.ExecuteNonQuery(); 292 return rows; 293 } 294 catch (System.Data.SqlClient.SqlException E) 295 { 296 throw new Exception(E.Message); 297 } 298 finally 299 { 300 cmd.Dispose(); 301 connection.Close(); 302 } 303 } 304 } 305 /// <summary> 306 /// 执行带一个存储过程参数的的SQL语句。 307 /// </summary> 308 /// <param name="SQLString">SQL语句</param> 309 /// <param name="content">参数内容,比如一个字段是格式复杂的文章,有特殊符号,可以通过这个方式新增</param> 310 /// <returns>影响的记录数</returns> 311 public static object ExecuteSqlGet(string SQLString, string content) 312 { 313 using (SqlConnection connection = new SqlConnection(connectionString)) 314 { 315 SqlCommand cmd = new SqlCommand(SQLString, connection); 316 System.Data.SqlClient.SqlParameter myParameter = new System.Data.SqlClient.SqlParameter("@content", SqlDbType.NText); 317 myParameter.Value = content; 318 cmd.Parameters.Add(myParameter); 319 try 320 { 321 connection.Open(); 322 object obj = cmd.ExecuteScalar(); 323 if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value))) 324 { 325 return null; 326 } 327 else 328 { 329 return obj; 330 } 331 } 332 catch (System.Data.SqlClient.SqlException E) 333 { 334 throw new Exception(E.Message); 335 } 336 finally 337 { 338 cmd.Dispose(); 339 connection.Close(); 340 } 341 } 342 } 343 /// <summary> 344 /// 向数据库里插入图像格式的字段(和上面情况类似的另一种实例) 345 /// </summary> 346 /// <param name="strSQL">SQL语句</param> 347 /// <param name="fs">图像字节,数据库的字段类型为image的情况</param> 348 /// <returns>影响的记录数</returns> 349 public static int ExecuteSqlInsertImg(string strSQL, byte[] fs) 350 { 351 using (SqlConnection connection = new SqlConnection(connectionString)) 352 { 353 SqlCommand cmd = new SqlCommand(strSQL, connection); 354 System.Data.SqlClient.SqlParameter myParameter = new System.Data.SqlClient.SqlParameter("@fs", SqlDbType.Image); 355 myParameter.Value = fs; 356 cmd.Parameters.Add(myParameter); 357 try 358 { 359 connection.Open(); 360 int rows = cmd.ExecuteNonQuery(); 361 return rows; 362 } 363 catch (System.Data.SqlClient.SqlException E) 364 { 365 throw new Exception(E.Message); 366 } 367 finally 368 { 369 cmd.Dispose(); 370 connection.Close(); 371 } 372 } 373 } 374 375 /// <summary> 376 /// 执行一条计算查询结果语句,返回查询结果(object)。 377 /// </summary> 378 /// <param name="SQLString">计算查询结果语句</param> 379 /// <returns>查询结果(object)</returns> 380 public static object GetSingle(string SQLString) 381 { 382 using (SqlConnection connection = new SqlConnection(connectionString)) 383 { 384 using (SqlCommand cmd = new SqlCommand(SQLString, connection)) 385 { 386 try 387 { 388 connection.Open(); 389 object obj = cmd.ExecuteScalar(); 390 if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value))) 391 { 392 return null; 393 } 394 else 395 { 396 return obj; 397 } 398 } 399 catch (System.Data.SqlClient.SqlException e) 400 { 401 402 throw new Exception(e.Message); 403 } 404 finally 405 { 406 connection.Close(); 407 } 408 } 409 } 410 } 411 412 413 /// <summary> 414 /// 执行查询语句,返回SqlDataReader(使用该方法切记要手工关闭SqlDataReader和连接) 415 /// </summary> 416 /// <param name="strSQL">查询语句</param> 417 /// <returns>SqlDataReader</returns> 418 public static SqlDataReader ExecuteReader(string strSQL) 419 { 420 SqlConnection connection = new SqlConnection(connectionString); 421 SqlCommand cmd = new SqlCommand(strSQL, connection); 422 try 423 { 424 connection.Open(); 425 SqlDataReader myReader = cmd.ExecuteReader(); 426 return myReader; 427 } 428 catch (System.Data.SqlClient.SqlException e) 429 { 430 throw new Exception(e.Message); 431 } 432 finally 433 { 434 connection.Close(); 435 } 436 } 437 /// <summary> 438 /// 执行查询语句,返回DataSet 439 /// </summary> 440 /// <param name="SQLString">查询语句</param> 441 /// <returns>DataSet</returns> 442 public static DataSet Query(string SQLString) 443 { 444 using (SqlConnection connection = new SqlConnection(connectionString)) 445 { 446 DataSet ds = new DataSet(); 447 try 448 { 449 connection.Open(); 450 SqlDataAdapter command = new SqlDataAdapter(SQLString, connection); 451 command.Fill(ds, "ds"); 452 } 453 catch (System.Data.SqlClient.SqlException ex) 454 { 455 throw new Exception(ex.Message); 456 } 457 finally 458 { 459 connection.Close(); 460 } 461 return ds; 462 } 463 } 464 /// <summary> 465 /// 执行查询语句,返回DataSet 466 /// </summary> 467 /// <param name="SQLString">查询语句</param> 468 /// <returns>DataSet</returns> 469 public static DataTable QueryDT(string SQLString, out string msg) 470 { 471 msg = ""; 472 using (SqlConnection connection = new SqlConnection(connectionString)) 473 { 474 DataTable dt = new DataTable(); 475 try 476 { 477 connection.Open(); 478 SqlDataAdapter command = new SqlDataAdapter(SQLString, connection); 479 command.Fill(dt); 480 } 481 catch (System.Data.SqlClient.SqlException ex) 482 { 483 msg = ex.Message; 484 //throw new Exception(ex.Message); 485 } 486 finally 487 { 488 connection.Close(); 489 } 490 return dt; 491 } 492 } 493 /// <summary> 494 /// 执行查询语句,返回DataSet 495 /// </summary> 496 /// <param name="SQLString">查询语句</param> 497 /// <returns>DataSet</returns> 498 public static DataTable QueryDT(string SQLString) 499 { 500 using (SqlConnection connection = new SqlConnection(connectionString)) 501 { 502 DataTable dt = new DataTable(); 503 try 504 { 505 connection.Open(); 506 SqlDataAdapter command = new SqlDataAdapter(SQLString, connection); 507 command.Fill(dt); 508 } 509 catch (System.Data.SqlClient.SqlException ex) 510 { 511 throw new Exception(ex.Message); 512 } 513 finally 514 { 515 connection.Close(); 516 } 517 return dt; 518 } 519 } 520 /// <summary> 521 /// 执行查询语句,返回DataSet,设置命令的执行等待时间 522 /// </summary> 523 /// <param name="SQLString"></param> 524 /// <param name="Times"></param> 525 /// <returns></returns> 526 public static DataSet Query(string SQLString, int Times) 527 { 528 using (SqlConnection connection = new SqlConnection(connectionString)) 529 { 530 DataSet ds = new DataSet(); 531 try 532 { 533 connection.Open(); 534 SqlDataAdapter command = new SqlDataAdapter(SQLString, connection); 535 command.SelectCommand.CommandTimeout = Times; 536 command.Fill(ds, "ds"); 537 } 538 catch (System.Data.SqlClient.SqlException ex) 539 { 540 throw new Exception(ex.Message); 541 } 542 finally 543 { 544 connection.Close(); 545 } 546 return ds; 547 } 548 } 549 550 #endregion 551 552 #region 执行带参数的SQL语句 553 554 /// <summary> 555 /// 执行SQL语句,返回影响的记录数 556 /// </summary> 557 /// <param name="SQLString">SQL语句</param> 558 /// <returns>影响的记录数</returns> 559 public static int ExecuteSql(string SQLString, params SqlParameter[] cmdParms) 560 { 561 using (SqlConnection connection = new SqlConnection(connectionString)) 562 { 563 using (SqlCommand cmd = new SqlCommand()) 564 { 565 try 566 { 567 PrepareCommand(cmd, connection, null, SQLString, cmdParms); 568 int rows = cmd.ExecuteNonQuery(); 569 cmd.Parameters.Clear(); 570 if (connection.State != ConnectionState.Closed) 571 { 572 connection.Close(); 573 connection.Dispose(); 574 } 575 return rows; 576 } 577 catch (System.Data.SqlClient.SqlException E) 578 { 579 throw new Exception(E.Message); 580 } 581 finally 582 { 583 if (connection.State != ConnectionState.Closed) 584 { 585 connection.Close(); 586 connection.Dispose(); 587 } 588 } 589 } 590 } 591 } 592 /// <summary> 593 /// 执行多条SQL语句,实现数据库事务。 594 /// </summary> 595 /// <param name="SQLStringList">SQL语句的哈希表(key为sql语句,value是该语句的SqlParameter[])</param> 596 public static void ExecuteSqlTran(Hashtable SQLStringList) 597 { 598 using (SqlConnection conn = new SqlConnection(connectionString)) 599 { 600 conn.Open(); 601 using (SqlTransaction trans = conn.BeginTransaction()) 602 { 603 SqlCommand cmd = new SqlCommand(); 604 try 605 { 606 //循环 607 foreach (DictionaryEntry myDE in SQLStringList) 608 { 609 string cmdText = myDE.Key.ToString(); 610 SqlParameter[] cmdParms = (SqlParameter[])myDE.Value; 611 PrepareCommand(cmd, conn, trans, cmdText, cmdParms); 612 int val = cmd.ExecuteNonQuery(); 613 cmd.Parameters.Clear(); 614 615 trans.Commit(); 616 } 617 618 } 619 catch 620 { 621 trans.Rollback(); 622 throw; 623 } 624 finally 625 { 626 if (conn.State != ConnectionState.Closed) 627 { 628 conn.Close(); 629 conn.Dispose(); 630 } 631 } 632 } 633 } 634 } 635 636 /// <summary> 637 /// 执行一条计算查询结果语句,返回查询结果(object)。 638 /// </summary> 639 /// <param name="SQLString">计算查询结果语句</param> 640 /// <returns>查询结果(object)</returns> 641 public static object GetSingle(string SQLString, params SqlParameter[] cmdParms) 642 { 643 using (SqlConnection connection = new SqlConnection(connectionString)) 644 { 645 using (SqlCommand cmd = new SqlCommand()) 646 { 647 try 648 { 649 PrepareCommand(cmd, connection, null, SQLString, cmdParms); 650 object obj = cmd.ExecuteScalar(); 651 cmd.Parameters.Clear(); 652 if (connection.State != ConnectionState.Closed) 653 { 654 connection.Close(); 655 } 656 if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value))) 657 { 658 return null; 659 } 660 else 661 { 662 return obj; 663 } 664 } 665 catch (System.Data.SqlClient.SqlException e) 666 { 667 throw new Exception(e.Message); 668 } 669 finally 670 { 671 if (connection.State != ConnectionState.Closed) 672 { 673 connection.Close(); 674 connection.Dispose(); 675 } 676 } 677 } 678 } 679 } 680 681 /// <summary> 682 /// 执行查询语句,返回SqlDataReader (使用该方法切记要手工关闭SqlDataReader和连接) 683 /// </summary> 684 /// <param name="strSQL">查询语句</param> 685 /// <returns>SqlDataReader</returns> 686 public static SqlDataReader ExecuteReader(string SQLString, params SqlParameter[] cmdParms) 687 { 688 SqlConnection connection = new SqlConnection(connectionString); 689 SqlCommand cmd = new SqlCommand(); 690 try 691 { 692 PrepareCommand(cmd, connection, null, SQLString, cmdParms); 693 SqlDataReader myReader = cmd.ExecuteReader(); 694 cmd.Parameters.Clear(); 695 696 if (connection.State != ConnectionState.Closed) 697 { 698 connection.Close(); 699 connection.Dispose(); 700 } 701 return myReader; 702 } 703 catch (System.Data.SqlClient.SqlException e) 704 { 705 throw new Exception(e.Message); 706 } 707 finally 708 { 709 if (connection.State != ConnectionState.Closed) 710 { 711 connection.Close(); 712 connection.Dispose(); 713 } 714 } 715 } 716 717 /// <summary> 718 /// 执行查询语句,返回DataSet 719 /// </summary> 720 /// <param name="SQLString">查询语句</param> 721 /// <returns>DataSet</returns> 722 public static DataSet Query(string SQLString, params SqlParameter[] cmdParms) 723 { 724 using (SqlConnection connection = new SqlConnection(connectionString)) 725 { 726 SqlCommand cmd = new SqlCommand(); 727 PrepareCommand(cmd, connection, null, SQLString, cmdParms); 728 using (SqlDataAdapter da = new SqlDataAdapter(cmd)) 729 { 730 DataSet ds = new DataSet(); 731 try 732 { 733 da.Fill(ds, "ds"); 734 cmd.Parameters.Clear(); 735 } 736 catch (System.Data.SqlClient.SqlException ex) 737 { 738 throw new Exception(ex.Message); 739 } 740 finally 741 { 742 if (connection.State != ConnectionState.Closed) 743 { 744 connection.Close(); 745 connection.Dispose(); 746 } 747 } 748 return ds; 749 } 750 } 751 } 752 753 754 private static void PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans, string cmdText, SqlParameter[] cmdParms) 755 { 756 if (conn.State != ConnectionState.Open) 757 conn.Open(); 758 cmd.Connection = conn; 759 cmd.CommandText = cmdText; 760 if (trans != null) 761 cmd.Transaction = trans; 762 cmd.CommandType = CommandType.Text;//cmdType; 763 if (cmdParms != null) 764 { 765 766 767 foreach (SqlParameter parameter in cmdParms) 768 { 769 if ((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input) && 770 (parameter.Value == null)) 771 { 772 parameter.Value = DBNull.Value; 773 } 774 cmd.Parameters.Add(parameter); 775 } 776 } 777 if (conn.State != ConnectionState.Closed) 778 { 779 conn.Close(); 780 conn.Dispose(); 781 } 782 } 783 784 #endregion 785 786 #region 存储过程操作 787 788 /// <summary> 789 /// 执行存储过程 (使用该方法切记要手工关闭SqlDataReader和连接) 790 /// </summary> 791 /// <param name="storedProcName">存储过程名</param> 792 /// <param name="parameters">存储过程参数</param> 793 /// <returns>SqlDataReader</returns> 794 public static SqlDataReader RunProcedure(string storedProcName, IDataParameter[] parameters) 795 { 796 SqlConnection connection = new SqlConnection(connectionString); 797 SqlDataReader returnReader; 798 connection.Open(); 799 SqlCommand command = BuildQueryCommand(connection, storedProcName, parameters); 800 command.CommandType = CommandType.StoredProcedure; 801 returnReader = command.ExecuteReader(); 802 connection.Close(); 803 connection.Dispose(); 804 return returnReader; 805 806 } 807 808 809 /// <summary> 810 /// 执行存储过程 811 /// </summary> 812 /// <param name="storedProcName">存储过程名</param> 813 /// <param name="parameters">存储过程参数</param> 814 /// <param name="tableName">DataSet结果中的表名</param> 815 /// <returns>DataSet</returns> 816 public static DataSet RunProcedure(string storedProcName, IDataParameter[] parameters, string tableName) 817 { 818 using (SqlConnection connection = new SqlConnection(connectionString)) 819 { 820 DataSet dataSet = new DataSet(); 821 connection.Open(); 822 SqlDataAdapter sqlDA = new SqlDataAdapter(); 823 sqlDA.SelectCommand = BuildQueryCommand(connection, storedProcName, parameters); 824 sqlDA.Fill(dataSet, tableName); 825 connection.Close(); 826 connection.Dispose(); 827 return dataSet; 828 } 829 } 830 public static DataSet RunProcedure(string storedProcName, IDataParameter[] parameters, string tableName, int Times) 831 { 832 using (SqlConnection connection = new SqlConnection(connectionString)) 833 { 834 DataSet dataSet = new DataSet(); 835 connection.Open(); 836 SqlDataAdapter sqlDA = new SqlDataAdapter(); 837 sqlDA.SelectCommand = BuildQueryCommand(connection, storedProcName, parameters); 838 sqlDA.SelectCommand.CommandTimeout = Times; 839 sqlDA.Fill(dataSet, tableName); 840 connection.Close(); 841 connection.Dispose(); 842 return dataSet; 843 } 844 } 845 846 847 /// <summary> 848 /// 构建 SqlCommand 对象(用来返回一个结果集,而不是一个整数值) 849 /// </summary> 850 /// <param name="connection">数据库连接</param> 851 /// <param name="storedProcName">存储过程名</param> 852 /// <param name="parameters">存储过程参数</param> 853 /// <returns>SqlCommand</returns> 854 private static SqlCommand BuildQueryCommand(SqlConnection connection, string storedProcName, IDataParameter[] parameters) 855 { 856 SqlCommand command = new SqlCommand(storedProcName, connection); 857 command.CommandType = CommandType.StoredProcedure; 858 foreach (SqlParameter parameter in parameters) 859 { 860 if (parameter != null) 861 { 862 // 检查未分配值的输出参数,将其分配以DBNull.Value. 863 if ((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input) && 864 (parameter.Value == null)) 865 { 866 parameter.Value = DBNull.Value; 867 } 868 command.Parameters.Add(parameter); 869 } 870 } 871 872 return command; 873 } 874 875 /// <summary> 876 /// 执行存储过程,返回影响的行数 877 /// </summary> 878 /// <param name="storedProcName">存储过程名</param> 879 /// <param name="parameters">存储过程参数</param> 880 /// <param name="rowsAffected">影响的行数</param> 881 /// <returns></returns> 882 public static int RunProcedure(string storedProcName, IDataParameter[] parameters, out int rowsAffected) 883 { 884 using (SqlConnection connection = new SqlConnection(connectionString)) 885 { 886 int result; 887 connection.Open(); 888 SqlCommand command = BuildIntCommand(connection, storedProcName, parameters); 889 rowsAffected = command.ExecuteNonQuery(); 890 result = (int)command.Parameters["ReturnValue"].Value; 891 connection.Close(); 892 connection.Dispose(); 893 return result; 894 } 895 } 896 897 /// <summary> 898 /// 创建 SqlCommand 对象实例(用来返回一个整数值) 899 /// </summary> 900 /// <param name="storedProcName">存储过程名</param> 901 /// <param name="parameters">存储过程参数</param> 902 /// <returns>SqlCommand 对象实例</returns> 903 private static SqlCommand BuildIntCommand(SqlConnection connection, string storedProcName, IDataParameter[] parameters) 904 { 905 SqlCommand command = BuildQueryCommand(connection, storedProcName, parameters); 906 command.Parameters.Add(new SqlParameter("ReturnValue", 907 SqlDbType.Int, 4, ParameterDirection.ReturnValue, 908 false, 0, 0, string.Empty, DataRowVersion.Default, null)); 909 return command; 910 } 911 #endregion 912 913 } 914 915 }