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