天天看點

C# SqlHerper

1、C# SqlHelper

C# SqlHerper
C# SqlHerper
1 public static class SqlHelper
  2     {
  3         private static readonly string conStr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;
  4 
  5         /// <summary>
  6         /// 執行增删改的
  7         /// </summary>
  8         /// <param name="sql"></param>
  9         /// <param name="cmdType"></param>
 10         /// <param name="pms"></param>
 11         /// <returns></returns>
 12         public static int ExecuteNonQuery(string sql, CommandType cmdType = CommandType.Text, params SqlParameter[] pms)
 13         {
 14             using (SqlConnection con = new SqlConnection(conStr))
 15             {
 16                 using (SqlCommand cmd = new SqlCommand(sql, con))
 17                 {
 18                     cmd.CommandType = cmdType;
 19                     if (pms != null)
 20                     {
 21                         cmd.Parameters.AddRange(pms);
 22                     }
 23                     con.Open();
 24                     return cmd.ExecuteNonQuery();
 25                 }
 26             }
 27         }
 28 
 29         /// <summary>
 30         /// 封裝一個執行傳回單個值的方法
 31         /// </summary>
 32         /// <param name="sql"></param>
 33         /// <param name="cmdType"></param>
 34         /// <param name="pms"></param>
 35         /// <returns></returns>
 36         public static object ExecuteScalar(string sql, CommandType cmdType = CommandType.Text, params SqlParameter[] pms)
 37         {
 38             using (SqlConnection con = new SqlConnection(conStr))
 39             {
 40                 using (SqlCommand cmd = new SqlCommand(sql, con))
 41                 {
 42                     cmd.CommandType = cmdType;
 43                     if (pms != null)
 44                     {
 45                         cmd.Parameters.AddRange(pms);
 46                     }
 47                     con.Open();
 48                     return cmd.ExecuteScalar();
 49                 }
 50             }
 51         }
 52 
 53         /// <summary>
 54         /// 傳回SqlDataReader對象的方法
 55         /// </summary>
 56         /// <param name="sql"></param>
 57         /// <param name="cmdType"></param>
 58         /// <param name="pms"></param>
 59         /// <returns></returns>
 60         public static SqlDataReader ExecuteReader(string sql, CommandType cmdType = CommandType.Text, params SqlParameter[] pms)
 61         {
 62             SqlConnection con = new SqlConnection(conStr);
 63             using (SqlCommand cmd = new SqlCommand(sql, con))
 64             {
 65                 cmd.CommandType = cmdType;
 66                 if (pms != null)
 67                 {
 68                     cmd.Parameters.AddRange(pms);
 69                 }
 70                 try
 71                 {
 72                     con.Open();
 73                     //這裡第二個參數代表在函數外部,如果掉了close()方法,則con會随之一起銷毀
 74                     return cmd.ExecuteReader(CommandBehavior.CloseConnection);
 75                 }
 76                 catch (Exception)
 77                 {
 78                     con.Close();
 79                     con.Dispose();
 80                     throw;
 81                 }
 82             }
 83         }
 84 
 85 
 86         /// <summary>
 87         /// //執行操作SQL語句,傳回DataTable
 88         /// </summary>
 89         /// <param name="sql"></param>
 90         /// <param name="cmdType"></param>
 91         /// <param name="pms"></param>
 92         /// <returns></returns>
 93         public static DataTable ExecuteToDataTable(string sql,CommandType cmdType = CommandType.Text,params SqlParameter[] pms)
 94         {
 95             DataTable dt = new DataTable();
 96             using (SqlDataAdapter adapter = new SqlDataAdapter(sql, conStr))
 97             {
 98                 adapter.SelectCommand.CommandType = cmdType;
 99                 if (pms != null)
100                 {
101                     adapter.SelectCommand.Parameters.AddRange(pms);
102                 }
103                 adapter.Fill(dt);
104             }
105 
106             return dt;
107         }
108 
109         /// <summary>
110         /// 執行操作SQL語句,傳回DataSet
111         /// </summary>
112         /// <param name="sql"></param>
113         public static DataSet ExecuteToDataSet(string sql, CommandType cmdType = CommandType.Text, params IDataParameter[] pms)
114         {
115             DataSet ds = new DataSet();
116             using (SqlDataAdapter adapter = new SqlDataAdapter(sql, conStr))
117             {
118                 adapter.SelectCommand.CommandType = cmdType;
119                 if (pms != null)
120                 {
121                     adapter.SelectCommand.Parameters.AddRange(pms);
122                 }
123                 adapter.Fill(ds);
124             }
125             return ds;
126         }
127 
128         /// <summary>
129         /// DataTable 轉換為List 集合
130         /// </summary>
131         /// <typeparam name="T">類型</typeparam>
132         /// <param name="dt">DataTable</param>
133         /// <returns></returns>
134         public static IList<T> DataTableToList<T>(DataTable dt) where T : class,new()
135         {
136             //建立一個屬性的清單
137             List<PropertyInfo> prlist = new List<PropertyInfo>();
138             //擷取T的類型執行個體  反射的入口
139             Type t = typeof(T);
140             //獲得T 的所有的Public 屬性 并找出T屬性和DataTable的列名稱相同的屬性(PropertyInfo) 并加入到屬性清單 
141             Array.ForEach<PropertyInfo>(t.GetProperties(), p => { if (dt.Columns.IndexOf(p.Name) != -1) prlist.Add(p); });
142             //建立傳回的集合
143             List<T> oblist = new List<T>();
144 
145             foreach (DataRow row in dt.Rows)
146             {
147                 //建立T的執行個體
148                 T ob = new T();
149                 //找到對應的資料  并指派
150                 prlist.ForEach(p => { if (row[p.Name] != DBNull.Value) p.SetValue(ob, row[p.Name], null); });
151                 //放入到傳回的集合中.
152                 oblist.Add(ob);
153             }
154             return oblist;
155         }
156 
157         /// <summary>
158         /// List集合 轉換為一個DataTable
159         /// </summary>
160         /// <typeparam name="T"></typeparam>
161         /// <param name="value"></param>
162         /// <returns></returns>
163         public static DataTable ListToDataTable<T>(IEnumerable<T> value) where T : class
164         {
165             //建立屬性的集合
166             List<PropertyInfo> pList = new List<PropertyInfo>();
167             //獲得反射的入口
168             Type type = typeof(T);
169             DataTable dt = new DataTable();
170             //把所有的public屬性加入到集合 并添加DataTable的列
171             Array.ForEach<PropertyInfo>(type.GetProperties(), p => { pList.Add(p); dt.Columns.Add(p.Name); });
172             foreach (var item in value)
173             {
174                 //建立一個DataRow執行個體
175                 DataRow row = dt.NewRow();
176                 //給row 指派
177                 pList.ForEach(p => row[p.Name] = p.GetValue(item, null));
178                 //加入到DataTable
179                 dt.Rows.Add(row);
180             }
181             return dt;
182         }
183 
184         //IDataReder轉實體類清單
185         public static List<T> ReaderToList<T>(IDataReader DataReader)
186         {
187             using (DataReader)
188             {
189                 List<string> field = new List<string>(DataReader.FieldCount);
190                 for (int i = 0; i < DataReader.FieldCount; i++)
191                 {
192                     field.Add(DataReader.GetName(i).ToLower());
193                 }
194                 List<T> list = new List<T>();
195                 while (DataReader.Read())
196                 {
197                     T model = Activator.CreateInstance<T>();
198                     foreach (PropertyInfo property in model.GetType().GetProperties(BindingFlags.GetProperty | BindingFlags.Public | BindingFlags.Instance))
199                     {
200                         if (field.Contains(property.Name.ToLower()))
201                         {
202                             //if (!IsNullOrDBNull(DataReader[property.Name]))
203                             if (DataReader[property.Name] != DBNull.Value)
204                             {
205                                 property.SetValue(model, HackType(DataReader[property.Name], property.PropertyType), null);
206                             }
207                         }
208                     }
209                     list.Add(model);
210                 }
211                 return list;
212             }
213         }
214 
215         /// <summary>
216         /// IDataReder轉實體類清單 空字元串和dbnull都傳回null
217         /// </summary>
218         /// <typeparam name="T"></typeparam>
219         /// <param name="DataReader"></param>
220         /// <returns></returns>
221         public static List<T> ReaderToListNull<T>(IDataReader DataReader)
222         {
223             using (DataReader)
224             {
225                 List<string> field = new List<string>(DataReader.FieldCount);
226                 for (int i = 0; i < DataReader.FieldCount; i++)
227                 {
228                     field.Add(DataReader.GetName(i).ToLower());
229                 }
230                 List<T> list = new List<T>();
231                 while (DataReader.Read())
232                 {
233                     T model = Activator.CreateInstance<T>();
234                     foreach (PropertyInfo property in model.GetType().GetProperties(BindingFlags.GetProperty | BindingFlags.Public | BindingFlags.Instance))
235                     {
236                         if (field.Contains(property.Name.ToLower()))
237                         {
238                             if (!IsNullOrDBNull(DataReader[property.Name]))
239                             //if (DataReader[property.Name] != DBNull.Value)
240                             {
241                                 property.SetValue(model, HackType(DataReader[property.Name], property.PropertyType), null);
242                             }
243                         }
244                     }
245                     list.Add(model);
246                 }
247                 return list;
248             }
249         }
250 
251         //IDataReder轉實體類清單
252         public static List<dynamic> ReaderToDynamicList(IDataReader DataReader)
253         {
254             using (DataReader)
255             {
256                 List<dynamic> list = new List<dynamic>();
257                 while (DataReader.Read())
258                 {
259                     dynamic DataObject = new ExpandoObject();
260                     var DataRow = DataObject as IDictionary<string, object>;
261 
262                     for (int i = 0; i < DataReader.FieldCount; i++)
263                     {
264                         DataRow.Add(DataReader.GetName(i).ToUpper(), DataReader[i]);
265                     }
266                     list.Add(DataRow);
267                 }
268                 return list;
269             }
270         }
271 
272         //這個類對可空類型進行判斷轉換,要不然會報錯
273         private static object HackType(object value, Type conversionType)
274         {
275             if (conversionType.IsGenericType && conversionType.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
276             {
277                 if (value == null)
278                     return null;
279 
280                 System.ComponentModel.NullableConverter nullableConverter = new System.ComponentModel.NullableConverter(conversionType);
281                 conversionType = nullableConverter.UnderlyingType;
282             }
283             return Convert.ChangeType(value, conversionType);
284         }
285 
286         private static bool IsNullOrDBNull(object obj)
287         {
288             return ((obj is DBNull) || string.IsNullOrEmpty(obj.ToString())) ? true : false;
289         }
290     }      

View Code

 2、c# SqlHelper微軟版本

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