SQLHelper例子

 

  1 using System;
  2 using System.Data;
  3 using System.Configuration;
  4 using System.Web;
  5 using System.Web.Security;
  6 using System.Collections;
  7 using System.Data.SqlClient;
  8 
  9 //该源码下载自http://www.51aspx.com/(51aspx.com)
 10 /// <summary>
 11 /// 数据库的通用访问代码
 12 /// 此类为抽象类,不允许实例化,在应用时直接调用即可
 13 /// </summary>
 14 public abstract class SqlHelper
 15 {
 16     //获取数据库连接字符串,其属于静态变量且只读,项目中所有文档可以直接使用,但不能修改
 17     public static readonly string ConnectionStringLocalTransaction = ConfigurationManager.ConnectionStrings["pubsConnectionString"].ConnectionString;
 18 
 19     // 哈希表用来存储缓存的参数信息,哈希表可以存储任意类型的参数。
 20     private static Hashtable parmCache = Hashtable.Synchronized(new Hashtable());
 21 
 22     /// <summary>
 23     ///执行一个不需要返回值的SqlCommand命令,通过指定专用的连接字符串。
 24     /// 使用参数数组形式提供参数列表 
 25     /// </summary>
 26     /// <remarks>
 27     /// 使用示例:
 28     ///  int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24));
 29     /// </remarks>
 30     /// <param name="connectionString">一个有效的数据库连接字符串</param>
 31     /// <param name="commandType">SqlCommand命令类型 (存储过程, T-SQL语句, 等等。)</param>
 32     /// <param name="commandText">存储过程的名字或者 T-SQL 语句</param>
 33     /// <param name="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>
 34     /// <returns>返回一个数值表示此SqlCommand命令执行后影响的行数</returns>
 35     public static int ExecuteNonQuery(string connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters)
 36     {
 37 
 38         SqlCommand cmd = new SqlCommand();
 39 
 40         using (SqlConnection conn = new SqlConnection(connectionString))
 41         {
 42             //通过PrePareCommand方法将参数逐个加入到SqlCommand的参数集合中
 43             PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);
 44             int val = cmd.ExecuteNonQuery();
 45 
 46             //清空SqlCommand中的参数列表
 47             cmd.Parameters.Clear();
 48             return val;
 49         }
 50     }
 51     
 52     /// <summary>
 53     ///执行一条不返回结果的SqlCommand,通过一个已经存在的数据库连接 
 54     /// 使用参数数组提供参数
 55     /// </summary>
 56     /// <remarks>
 57     /// 使用示例:  
 58     ///  int result = ExecuteNonQuery(conn, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24));
 59     /// </remarks>
 60     /// <param name="conn">一个现有的数据库连接</param>
 61     /// <param name="commandType">SqlCommand命令类型 (存储过程, T-SQL语句, 等等。)</param>
 62     /// <param name="commandText">存储过程的名字或者 T-SQL 语句</param>
 63     /// <param name="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>
 64     /// <returns>返回一个数值表示此SqlCommand命令执行后影响的行数</returns>
 65     public static int ExecuteNonQuery(SqlConnection connection, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters)
 66     {
 67 
 68         SqlCommand cmd = new SqlCommand();
 69 
 70         PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters);
 71         int val = cmd.ExecuteNonQuery();
 72         cmd.Parameters.Clear();
 73         return val;
 74     }
 75 
 76     /// <summary>
 77     /// 执行一条不返回结果的SqlCommand,通过一个已经存在的数据库事物处理 
 78     /// 使用参数数组提供参数
 79     /// </summary>
 80     /// <remarks>
 81     /// 使用示例: 
 82     ///  int result = ExecuteNonQuery(trans, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24));
 83     /// </remarks>
 84     /// <param name="trans">一个存在的 sql 事物处理</param>
 85     /// <param name="commandType">SqlCommand命令类型 (存储过程, T-SQL语句, 等等。)</param>
 86     /// <param name="commandText">存储过程的名字或者 T-SQL 语句</param>
 87     /// <param name="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>
 88     /// <returns>返回一个数值表示此SqlCommand命令执行后影响的行数</returns>
 89     public static int ExecuteNonQuery(SqlTransaction trans, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters)
 90     {
 91         SqlCommand cmd = new SqlCommand();
 92         PrepareCommand(cmd, trans.Connection, trans, cmdType, cmdText, commandParameters);
 93         int val = cmd.ExecuteNonQuery();
 94         cmd.Parameters.Clear();
 95         return val;
 96     }
 97 
 98     /// <summary>
 99     /// 执行一条返回结果集的SqlCommand命令,通过专用的连接字符串。
100     /// 使用参数数组提供参数
101     /// </summary>
102     /// <remarks>
103     /// 使用示例:  
104     ///  SqlDataReader r = ExecuteReader(connString, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24));
105     /// </remarks>
106     /// <param name="connectionString">一个有效的数据库连接字符串</param>
107     /// <param name="commandType">SqlCommand命令类型 (存储过程, T-SQL语句, 等等。)</param>
108     /// <param name="commandText">存储过程的名字或者 T-SQL 语句</param>
109     /// <param name="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>
110     /// <returns>返回一个包含结果的SqlDataReader</returns>
111     public static SqlDataReader ExecuteReader(string connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters)
112     {
113         SqlCommand cmd = new SqlCommand();
114         SqlConnection conn = new SqlConnection(connectionString);
115 
116         // 在这里使用try/catch处理是因为如果方法出现异常,则SqlDataReader就不存在,
117         //CommandBehavior.CloseConnection的语句就不会执行,触发的异常由catch捕获。
118         //关闭数据库连接,并通过throw再次引发捕捉到的异常。
119         try
120         {
121             PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);
122             SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
123             cmd.Parameters.Clear();
124             return rdr;
125         }
126         catch
127         {
128             conn.Close();
129             throw;
130         }
131     }
132 
133     /// <summary>
134     /// 执行一条返回第一条记录第一列的SqlCommand命令,通过专用的连接字符串。 
135     /// 使用参数数组提供参数
136     /// </summary>
137     /// <remarks>
138     /// 使用示例:  
139     ///  Object obj = ExecuteScalar(connString, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24));
140     /// </remarks>
141     /// <param name="connectionString">一个有效的数据库连接字符串</param>
142     /// <param name="commandType">SqlCommand命令类型 (存储过程, T-SQL语句, 等等。)</param>
143     /// <param name="commandText">存储过程的名字或者 T-SQL 语句</param>
144     /// <param name="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>
145     /// <returns>返回一个object类型的数据,可以通过 Convert.To{Type}方法转换类型</returns>
146     public static object ExecuteScalar(string connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters)
147     {
148         SqlCommand cmd = new SqlCommand();
149 
150         using (SqlConnection connection = new SqlConnection(connectionString))
151         {
152             PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters);
153             object val = cmd.ExecuteScalar();
154             cmd.Parameters.Clear();
155             return val;
156         }
157     }
158 
159     /// <summary>
160     /// 执行一条返回第一条记录第一列的SqlCommand命令,通过已经存在的数据库连接。
161     /// 使用参数数组提供参数
162     /// </summary>
163     /// <remarks>
164     /// 使用示例: 
165     ///  Object obj = ExecuteScalar(connString, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24));
166     /// </remarks>
167     /// <param name="conn">一个已经存在的数据库连接</param>
168     /// <param name="commandType">SqlCommand命令类型 (存储过程, T-SQL语句, 等等。)</param>
169     /// <param name="commandText">存储过程的名字或者 T-SQL 语句</param>
170     /// <param name="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>
171     /// <returns>返回一个object类型的数据,可以通过 Convert.To{Type}方法转换类型</returns>
172     public static object ExecuteScalar(SqlConnection connection, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters)
173     {
174 
175         SqlCommand cmd = new SqlCommand();
176 
177         PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters);
178         object val = cmd.ExecuteScalar();
179         cmd.Parameters.Clear();
180         return val;
181     }
182 
183     /// <summary>
184     /// 缓存参数数组
185     /// </summary>
186     /// <param name="cacheKey">参数缓存的键值</param>
187     /// <param name="cmdParms">被缓存的参数列表</param>
188     public static void CacheParameters(string cacheKey, params SqlParameter[] commandParameters)
189     {
190         parmCache[cacheKey] = commandParameters;
191     }
192 
193     /// <summary>
194     /// 获取被缓存的参数
195     /// </summary>
196     /// <param name="cacheKey">用于查找参数的KEY值</param>
197     /// <returns>返回缓存的参数数组</returns>
198     public static SqlParameter[] GetCachedParameters(string cacheKey)
199     {
200         SqlParameter[] cachedParms = (SqlParameter[])parmCache[cacheKey];
201 
202         if (cachedParms == null)
203             return null;
204 
205         //新建一个参数的克隆列表
206         SqlParameter[] clonedParms = new SqlParameter[cachedParms.Length];
207 
208         //通过循环为克隆参数列表赋值
209         for (int i = 0, j = cachedParms.Length; i < j; i++)
210             //使用clone方法复制参数列表中的参数
211             clonedParms[i] = (SqlParameter)((ICloneable)cachedParms[i]).Clone();
212 
213         return clonedParms;
214     }
215 
216     /// <summary>
217     /// 为执行命令准备参数
218     /// </summary>
219     /// <param name="cmd">SqlCommand 命令</param>
220     /// <param name="conn">已经存在的数据库连接</param>
221     /// <param name="trans">数据库事物处理</param>
222     /// <param name="cmdType">SqlCommand命令类型 (存储过程, T-SQL语句, 等等。)</param>
223     /// <param name="cmdText">Command text,T-SQL语句 例如 Select * from Products</param>
224     /// <param name="cmdParms">返回带参数的命令</param>
225     private static void PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans, CommandType cmdType, string cmdText, SqlParameter[] cmdParms)
226     {
227 
228         //判断数据库连接状态
229         if (conn.State != ConnectionState.Open)
230             conn.Open();
231 
232         cmd.Connection = conn;
233         cmd.CommandText = cmdText;
234 
235         //判断是否需要事物处理
236         if (trans != null)
237             cmd.Transaction = trans;
238 
239         cmd.CommandType = cmdType;
240 
241         if (cmdParms != null)
242         {
243             foreach (SqlParameter parm in cmdParms)
244                 cmd.Parameters.Add(parm);
245         }
246     }
247 }
248 

附有全部代码/Files/hsrzyn/51aspxSqlHelper_51aspx.rar

posted @ 2009-08-14 20:56  hsrzyn  阅读(7039)  评论(0)    收藏  举报