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