SQLHelper是什么我就不多说了,这里想谈一下个人关于SQLHelper的应用,希望对您有所帮助。
这个应该很眼熟吧,OK,下面开始:
UserInfo是一个类是封装属性过程的地方:
二在业务逻辑里我想检查这个查询是否成功并且要把它显示出来
三在页面看看这个结果
四最后在Page_Load方法中调用一下
实际上个人感觉这么做还有不好的地方,显示层和业务逻辑层有渗透这个很让我头疼,曾经想把结果集的验证抽出来封一个方法,但是没有搞定List<>的动态加载问题,所以在这里也想请教一下有关的解决方法,或者也欢迎大家把自己更好的数据库分层操作拿出来看看邮箱:ask.me1@163.com。
- using System;
- using System.Data;
- using System.Configuration;
- using System.Web;
- using System.Web.Security;
- using System.Collections;
- using System.Data.SqlClient;
- /// <summary>
- /// 数据库的通用访问代码
- /// 此类为抽象类,不允许实例化,在应用时直接调用即可
- /// </summary>
- public abstract class SqlHelper
- {
- //获取数据库连接字符串,其属于静态变量且只读,项目中所有文档可以直接使用,但不能修改
- public static readonly string ConnectionStringLocalTransaction = ConfigurationManager.ConnectionStrings["pubsConnectionString"].ConnectionString;
- // 哈希表用来存储缓存的参数信息,哈希表可以存储任意类型的参数。
- private static Hashtable parmCache = Hashtable.Synchronized(new Hashtable());
- /// <summary>
- ///执行一个不需要返回值的SqlCommand命令,通过指定专用的连接字符串。
- /// 使用参数数组形式提供参数列表
- /// </summary>
- /// <remarks>
- /// 使用示例:
- /// int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24));
- /// </remarks>
- /// <param name="connectionString">一个有效的数据库连接字符串</param>
- /// <param name="commandType">SqlCommand命令类型 (存储过程, T-SQL语句, 等等。)</param>
- /// <param name="commandText">存储过程的名字或者 T-SQL 语句</param>
- /// <param name="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>
- /// <returns>返回一个数值表示此SqlCommand命令执行后影响的行数</returns>
- public static int ExecuteNonQuery(string connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters)
- {
- SqlCommand cmd = new SqlCommand();
- using (SqlConnection conn = new SqlConnection(connectionString))
- {
- //通过PrePareCommand方法将参数逐个加入到SqlCommand的参数集合中
- PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);
- int val = cmd.ExecuteNonQuery();
- //清空SqlCommand中的参数列表
- cmd.Parameters.Clear();
- return val;
- }
- }
- /// <summary>
- ///执行一条不返回结果的SqlCommand,通过一个已经存在的数据库连接
- /// 使用参数数组提供参数
- /// </summary>
- /// <remarks>
- /// 使用示例:
- /// int result = ExecuteNonQuery(conn, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24));
- /// </remarks>
- /// <param name="conn">一个现有的数据库连接</param>
- /// <param name="commandType">SqlCommand命令类型 (存储过程, T-SQL语句, 等等。)</param>
- /// <param name="commandText">存储过程的名字或者 T-SQL 语句</param>
- /// <param name="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>
- /// <returns>返回一个数值表示此SqlCommand命令执行后影响的行数</returns>
- public static int ExecuteNonQuery(SqlConnection connection, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters)
- {
- SqlCommand cmd = new SqlCommand();
- PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters);
- int val = cmd.ExecuteNonQuery();
- cmd.Parameters.Clear();
- return val;
- }
- /// <summary>
- /// 执行一条不返回结果的SqlCommand,通过一个已经存在的数据库事物处理
- /// 使用参数数组提供参数
- /// </summary>
- /// <remarks>
- /// 使用示例:
- /// int result = ExecuteNonQuery(trans, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24));
- /// </remarks>
- /// <param name="trans">一个存在的 sql 事物处理</param>
- /// <param name="commandType">SqlCommand命令类型 (存储过程, T-SQL语句, 等等。)</param>
- /// <param name="commandText">存储过程的名字或者 T-SQL 语句</param>
- /// <param name="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>
- /// <returns>返回一个数值表示此SqlCommand命令执行后影响的行数</returns>
- public static int ExecuteNonQuery(SqlTransaction trans, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters)
- {
- SqlCommand cmd = new SqlCommand();
- PrepareCommand(cmd, trans.Connection, trans, cmdType, cmdText, commandParameters);
- int val = cmd.ExecuteNonQuery();
- cmd.Parameters.Clear();
- return val;
- }
- /// <summary>
- /// 执行一条返回结果集的SqlCommand命令,通过专用的连接字符串。
- /// 使用参数数组提供参数
- /// </summary>
- /// <remarks>
- /// 使用示例:
- /// SqlDataReader r = ExecuteReader(connString, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24));
- /// </remarks>
- /// <param name="connectionString">一个有效的数据库连接字符串</param>
- /// <param name="commandType">SqlCommand命令类型 (存储过程, T-SQL语句, 等等。)</param>
- /// <param name="commandText">存储过程的名字或者 T-SQL 语句</param>
- /// <param name="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>
- /// <returns>返回一个包含结果的SqlDataReader</returns>
- public static SqlDataReader ExecuteReader(string connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters)
- {
- SqlCommand cmd = new SqlCommand();
- SqlConnection conn = new SqlConnection(connectionString);
- // 在这里使用try/catch处理是因为如果方法出现异常,则SqlDataReader就不存在,
- //CommandBehavior.CloseConnection的语句就不会执行,触发的异常由catch捕获。
- //关闭数据库连接,并通过throw再次引发捕捉到的异常。
- try
- {
- PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);
- SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
- cmd.Parameters.Clear();
- return rdr;
- }
- catch
- {
- conn.Close();
- throw;
- }
- }
- /// <summary>
- /// 执行一条返回第一条记录第一列的SqlCommand命令,通过专用的连接字符串。
- /// 使用参数数组提供参数
- /// </summary>
- /// <remarks>
- /// 使用示例:
- /// Object obj = ExecuteScalar(connString, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24));
- /// </remarks>
- /// <param name="connectionString">一个有效的数据库连接字符串</param>
- /// <param name="commandType">SqlCommand命令类型 (存储过程, T-SQL语句, 等等。)</param>
- /// <param name="commandText">存储过程的名字或者 T-SQL 语句</param>
- /// <param name="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>
- /// <returns>返回一个object类型的数据,可以通过 Convert.To{Type}方法转换类型</returns>
- public static object ExecuteScalar(string connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters)
- {
- SqlCommand cmd = new SqlCommand();
- using (SqlConnection connection = new SqlConnection(connectionString))
- {
- PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters);
- object val = cmd.ExecuteScalar();
- cmd.Parameters.Clear();
- return val;
- }
- }
- /// <summary>
- /// 执行一条返回第一条记录第一列的SqlCommand命令,通过已经存在的数据库连接。
- /// 使用参数数组提供参数
- /// </summary>
- /// <remarks>
- /// 使用示例:
- /// Object obj = ExecuteScalar(connString, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24));
- /// </remarks>
- /// <param name="conn">一个已经存在的数据库连接</param>
- /// <param name="commandType">SqlCommand命令类型 (存储过程, T-SQL语句, 等等。)</param>
- /// <param name="commandText">存储过程的名字或者 T-SQL 语句</param>
- /// <param name="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>
- /// <returns>返回一个object类型的数据,可以通过 Convert.To{Type}方法转换类型</returns>
- public static object ExecuteScalar(SqlConnection connection, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters)
- {
- SqlCommand cmd = new SqlCommand();
- PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters);
- object val = cmd.ExecuteScalar();
- cmd.Parameters.Clear();
- return val;
- }
- /// <summary>
- /// 缓存参数数组
- /// </summary>
- /// <param name="cacheKey">参数缓存的键值</param>
- /// <param name="cmdParms">被缓存的参数列表</param>
- public static void CacheParameters(string cacheKey, params SqlParameter[] commandParameters)
- {
- parmCache[cacheKey] = commandParameters;
- }
- /// <summary>
- /// 获取被缓存的参数
- /// </summary>
- /// <param name="cacheKey">用于查找参数的KEY值</param>
- /// <returns>返回缓存的参数数组</returns>
- public static SqlParameter[] GetCachedParameters(string cacheKey)
- {
- SqlParameter[] cachedParms = (SqlParameter[])parmCache[cacheKey];
- if (cachedParms == null)
- return null;
- //新建一个参数的克隆列表
- SqlParameter[] clonedParms = new SqlParameter[cachedParms.Length];
- //通过循环为克隆参数列表赋值
- for (int i = 0, j = cachedParms.Length; i < j; i++)
- //使用clone方法复制参数列表中的参数
- clonedParms[i] = (SqlParameter)((ICloneable)cachedParms[i]).Clone();
- return clonedParms;
- }
- /// <summary>
- /// 为执行命令准备参数
- /// </summary>
- /// <param name="cmd">SqlCommand 命令</param>
- /// <param name="conn">已经存在的数据库连接</param>
- /// <param name="trans">数据库事物处理</param>
- /// <param name="cmdType">SqlCommand命令类型 (存储过程, T-SQL语句, 等等。)</param>
- /// <param name="cmdText">Command text,T-SQL语句 例如 Select * from Products</param>
- /// <param name="cmdParms">返回带参数的命令</param>
- private static void PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans, CommandType cmdType, string cmdText, SqlParameter[] cmdParms)
- {
- //判断数据库连接状态
- if (conn.State != ConnectionState.Open)
- conn.Open();
- cmd.Connection = conn;
- cmd.CommandText = cmdText;
- //判断是否需要事物处理
- if (trans != null)
- cmd.Transaction = trans;
- cmd.CommandType = cmdType;
- if (cmdParms != null)
- {
- foreach (SqlParameter parm in cmdParms)
- cmd.Parameters.Add(parm);
- }
- }
- }
一习惯在数据层干的事情,准备一个查询(这里我习惯用List<>),将结果返回。
- public static List<UsersInfo> SelectAllUsersInfo()
- {
- List<UsersInfo> list = new List<UsersInfo>();
- SqlDataReader dr = SqlHelper.ExecuteReader(
- SqlHelper.ConnectionStringLocalTransaction,
- CommandType.Text,
- "select * from Users");
- while (dr.Read())
- {
- UsersInfo ui = new UsersInfo();
- ui.Id = dr.GetInt32(0);
- ui.Name = dr.GetString(1);
- ui.Sex = dr.GetBoolean(2);
- list.Add(ui);
- }
- dr.Close();
- return list;
- }
- using System;
- using System.Data;
- using System.Configuration;
- using System.Web;
- using System.Web.Security;
- using System.Web.UI;
- using System.Web.UI.WebControls;
- using System.Web.UI.WebControls.WebParts;
- using System.Web.UI.HtmlControls;
- /// <summary>
- /// UsersInfo 的摘要说明
- /// </summary>
- public class UsersInfo
- {
- public UsersInfo()
- {}
- private int id;
- public int Id
- {
- get { return id; }
- set { id = value; }
- }
- private string name;
- public string Name
- {
- get { return name; }
- set { name = value; }
- }
- private bool sex;
- public bool Sex
- {
- get { return sex; }
- set { sex = value; }
- }
- }
- public static int GetAllUsersInfo(GridView gv)
- {
- try
- {
- List<UsersInfo> list = ReadData.SelectAllUsersInfo();
- if (list == null)
- {
- //返回表示没有符合要求的查询值
- return 1;
- }
- else
- {
- //将符合要求的查询结果返回给页面进行显示
- gv.DataSource = list;
- gv.DataBind();
- return 2;
- }
- }
- catch (Exception)
- {
- //返回标示异常值
- return 0;
- }
- }
- public string Bind()
- {
- int state = ReadUsersInfo.GetAllUsersInfo(this.GridView1);
- switch (state)
- {
- case 0:
- //查询过程出现异常
- return "异常的友好提示";
- this.GridView1.Visible = false;
- break;
- case 1:
- return "没有符合要求的结果";
- this.GridView1.Visible = false;
- break;
- case 2:
- return null;
- this.GridView1.Visible = true;
- break;
- }
- }
- protected void Page_Load(object sender, EventArgs e)
- {
- if (!Page.IsPostBack)
- {
- Response.Write("<script>alert('" + Bind() + "');</script>");
- }
- }