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
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