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

如果要获取连接数据连接对象或字符串的话,先要修改SQLHelper类中GetConnSting() 方法中的ConfigurationManager.ConnectionStrings["ConStr"].ConnectionString;才能调用。

最新文章

  1. nodeJS 简单的模块。
  2. js最详细的基础,jquery 插件最全的教材
  3. java删除文件,慎重
  4. java获取汉字拼音首字母 --转载
  5. (DFS、bitset)AOJ-0525 Osenbei
  6. Spring注入方式
  7. 带选择的sql简单用法
  8. DBA_Oracle Erp R12中文补丁安装升级(案例)
  9. Jquery 模板插件 jquery.tmpl.js 的使用方法(2):嵌套each循环,temp调用(使用预编译的模板缓存)
  10. php基础知识【函数】(5)正则preg
  11. 从sample来学习Java堆(转)
  12. golang 并发之协程及通道
  13. OCA读书笔记(3) - 使用DBCA创建Oracle数据库
  14. [DP优化方法之虚树]
  15. 分离数据库时出错:无法对数据库&#39;XXX&#39; 执行删除,因为它正用于复制&quot;的解决方法
  16. Flask入门之自定义过滤器(匹配器)
  17. Java转PHP的心路历程
  18. Springboot 系列(十二)使用 Mybatis 集成 pagehelper 分页插件和 mapper 插件
  19. 将多窗体应用程序改造为仿Chrome形式的简易方法
  20. spring boot 整合freemarker(好用!!!!)

热门文章

  1. 论文笔记之:Large Scale Distributed Semi-Supervised Learning Using Streaming Approximation
  2. JSBinding / Home
  3. Python for loop and while loop
  4. spring mvc 4数据校验 validator
  5. 创建MySQL 用户
  6. [家里蹲大学数学杂志]第047期18 世纪法国数学界的3L
  7. java内存溢出分析(一)
  8. OpenExplorer打开文件夹
  9. Aspose.Cells 设置背景颜色
  10. jQuery - 疑惑