编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

SQL - 编写SqlHelper帮助类,简化数据操作代码 173

wxchong 2024-10-21 13:04:04 开源技术 67 ℃ 0 评论

#妙笔生花创作挑战#

封装SQLHelper帮助类,不用每次都去重复书写连接字符串,声明SqlConnection与SqlCommand对象等代码,主要是为了减少代码量使用方便

将其写在一个类库(Helper)中的益处: 1)是每次使用只需引用这个类库即可,引用方式与引用System.configuration程序集一样; 2)是不用每次 再去修改命名空间名称;在类库中添加一个名称为SQLHelper的类,里面专门编写操作数据库的相关方法;帮助类的方法一般都是静态方法,使用时直接类名.方法名即可 3)可以当做一个集成工具,添加其他的帮助类

1 执行insert、delete、update语句的静态方法(要执行的SQL语句,可变参数数组)

//会用到的类库
using System;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;

public class SQLHelper
{
    //读取配置文件的连接字符串
    private static readonly string constr = ConfigurationManager.ConnectionStrings["sql"].ConnectionString;
     /// <summary>
    /// 执行insert、delete、update语句的方法
    /// </summary>
    /// <param name="sql">要执行的SQL语句</param>
    /// <param name="pms">可变参数数组</param>
    /// <returns>执行语句受影响的行数</returns>
    public static int ExecuteNonQuery(string sql, params SqlParameter[] pms)
    {
        //声明连接对象,传入连接字符串
        using (SqlConnection con = new SqlConnection(constr))
        {
            //声明执行对象,传入(要执行的SQL语句,连接对象)
            using (SqlCommand cmd = new SqlCommand(sql, con))
            {
                //判断:当参数数组不为空时
                //将参数数组加入到执行对象中
                if (pms != null)
                {
                    cmd.Parameters.AddRange(pms);
                }
                con.Open();
                return cmd.ExecuteNonQuery();
            }
        }
    }
}

2)执行返回首行首列的值的ExecuteScalar()方法(object类型,在外界根据需求自行强制转换)

//编写在public class SQLHelper类中
//执行返回首行首列的值
public static object ExecuteScalar(string sql, params SqlParameter[] pms)
{
    using (SqlConnection con = new SqlConnection(constr))
    {
        using (SqlCommand cmd = new SqlCommand(sql, con))
        {
            if (pms != null)
            {
                cmd.Parameters.AddRange(pms);
            }
            con.Open();
            return cmd.ExecuteScalar();
        }
    }
}

3 执行返回DataReader()的方法

//编写在public class SQLHelper类中
//执行返回DataReader
public static SqlDataReader ExecuteReader(string sql, params SqlParameter[] pms)
{
    //由于要返回一个DataReader,而DataReader返回给用户使用时候连接必须保证是
    //打开的状态所以这里Connection不能关闭,不能写在using中
    SqlConnection con = new SqlConnection(constr);
    using (SqlCommand cmd = new SqlCommand(sql, con))
    {
        if (pms != null)
        {
            cmd.Parameters.AddRange(pms);
        }
        con.Open();        
       //外部使用ExecuteReader方法的时候,连接通道不能使用using
       //因为read读取器是在外部使用读取数据;此处使用
       //CommandBehavior.CloseConnectio这个枚举
       //表示数据读取完毕后自动关闭Connection连接通道
        return cmd.ExecuteReader(CommandBehavior.CloseConnection);
    }
}

4 封装一个执行sql语句返回DataTable的ExecuteDataTable()方法

//编写在public class SQLHelper类中
//封装一个执行sql语句返回DataTable的方法
public static DataTable ExecuteDataTable(string sql, params SqlParameter[] pms)
{
    using (SqlDataAdapter adapter = new SqlDataAdapter(sql, constr))
    {
        if (pms != null)
        {
            //SqlDataAdapter对象会自动在内部创建一个Command对象,
            //通过SelectCommand属性就可以访问到该对象
            adapter.SelectCommand.Parameters.AddRange(pms);
        }
        DataTable dt = new DataTable();
        adapter.Fill(dt);
        return dt;
    }
}

示例:调用SQLHelper类库中的ExecuteDataTable()方法,读取数据绑定到dgv1上显示

1 引用SQLHelper类库

2 编写配置文件信息

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
  <connectionStrings>
    <!--name:读取此节点信息的名称 -->
    <!--connectionString:连接字符串的验证内容-->
    <!--以Windows身份验证的连接字符串-->
    <add name="conStr" connectionString="Data Source=.;Initial Catalog=School;Integrated Security=True;"/>
    <!--以SQL server 身份验证的连接字符串-->
    <!--<add name="conStr" connectionString="Data Source=.;Initial Catalog=School;User Id=sa;password=123"/>-->
  </connectionStrings>
</configuration>

3 在加载事件中编写调用ExecuteDataTable()静态方法的实现代码

//需要引用的命名空间
using System.Data;
using System.Data.SqlClient;

private void Form1_Load(object sender, EventArgs e)
{
    //1编写要执行的SQL代码
    //查询出SId<20的学生信息
    string sql = "select * from Student where SId < @sid";
    //为参数赋值
    SqlParameter sp = new SqlParameter("@sid",20);
    //声明一个DataTable类型的变量,接收查询出的数据
    DataTable dt = Helper.SQLHelper.ExecuteDataTable(sql,sp);
    //执行SQLHelper.ExecuteDataTable()方法时
    //如果报出"初始值设定项引发异常"的异常
    //错误在于匹配文件中name的值与类库中读取的不一致
    //如匹配文件 name="sql";类库中 ConnectionStrings["conStr"]
    //就会引发上述的异常

    //将dt 绑定到 dgv1 上显示
    dgv1.DataSource = dt;
}

其他几个静态方法使用过程以此类推;以后再说通过EF实体框架操作数据库,使用此框架可以实现如:A从数据库生成Class类 B由实体类生成数据库表结构 C通过数据库可视化设计器设计数据库,同时生成实体类;执行增删改查等功能

不管什么框架,只要其底层实现代码没有改变,底层就还是这些基础东西,只是使用对应的框架使得软件开发变得更加高效便捷

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表