个人关于SQLHelper的应用

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

  1.  public static int GetAllUsersInfo(GridView gv)
  2.     {
  3.         try
  4.         {
  5.             List<UsersInfo> list = ReadData.SelectAllUsersInfo();
  6.             if (list == null)
  7.             {
  8.                 //返回表示没有符合要求的查询值
  9.                 return 1;
  10.             }
  11.             else
  12.             {
  13.                 //将符合要求的查询结果返回给页面进行显示
  14.                 gv.DataSource = list;
  15.                 gv.DataBind();
  16.                 return 2;
  17.             }
  18.         }
  19.         catch (Exception)
  20.         {
  21.             //返回标示异常值
  22.             return 0;
  23.         }        
  24.     }
三在页面看看这个结果
  1. public string Bind()
  2.     {
  3.         int state = ReadUsersInfo.GetAllUsersInfo(this.GridView1);
  4.         switch (state)
  5.         {
  6.             case 0:
  7.                 //查询过程出现异常
  8.                 return "异常的友好提示";
  9.                 this.GridView1.Visible = false;
  10.                 break;
  11.             case 1:
  12.                 return "没有符合要求的结果";
  13.                 this.GridView1.Visible = false;
  14.                 break;
  15.             case 2:
  16.                 return null;
  17.                 this.GridView1.Visible = true;
  18.                 break;
  19.         }
  20.     }
四最后在Page_Load方法中调用一下
  1. protected void Page_Load(object sender, EventArgs e)
  2.     {
  3.         if (!Page.IsPostBack)
  4.         {
  5.             Response.Write("<script>alert('" + Bind() + "');</script>");
  6.         }        
  7.     }
实际上个人感觉这么做还有不好的地方,显示层和业务逻辑层有渗透这个很让我头疼,曾经想把结果集的验证抽出来封一个方法,但是没有搞定List<>的动态加载问题,所以在这里也想请教一下有关的解决方法,或者也欢迎大家把自己更好的数据库分层操作拿出来看看邮箱:ask.me1@163.com。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值