Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 3090|回复: 0

[默认分类] 微软SQLHelper.cs类 中文版

[复制链接]
  • TA的每日心情
    开心
    2021-12-13 21:45
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2018-5-28 13:01:02 | 显示全部楼层 |阅读模式

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

      
       
    C
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-5-9 00:37 , Processed in 0.363573 second(s), 37 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表