SqlHelper类(C#)

大神可以绕道了...

目的:搜集SqlHelper类

自己写的一个SQLHelper类,如下:

编辑App.config节点,添加<connectionStrings>节点,并根据实际填上相应的参数

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
    </startup>

  <connectionStrings>
    <add name="connString" connectionString="Server=数据库所在的地址;DataBase=数据库名称;Uid=用户名;Pwd=密码"/>
  </connectionStrings>
</configuration>
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DAL
{
    public class SQLHelper
    {
        //数据库连接字符串,从配置文件中读取
        public static string connString = ConfigurationManager.ConnectionStrings["connString"].ConnectionString;


        /// <summary>
        /// 数据库的更新操作,如:增、删、改
        /// </summary>
        /// <param name="sql">sql语句</param>
        /// <param name="param">sql参数</param>
        /// <returns></returns>
        public static int Update(string sql,params SqlParameter []param) {
            SqlConnection conn = new SqlConnection(connString);
            SqlCommand cmd = new SqlCommand(sql, conn);
            if(param!=null&&param.Length>0){
                //添加参数
                cmd.Parameters.AddRange(param);
            }
            try
            {
                //打开数据库
                conn.Open();
                return cmd.ExecuteNonQuery();
            }
            catch (Exception ex)
            {

                throw ex;
            }
            finally { 
                //关闭数据库
                conn.Close();
            }
            
        }


        /// <summary>
        /// 获取单一结果
        /// </summary>
        /// <param name="sql">sql语句</param>
        /// <param name="param">sql参数</param>
        /// <returns></returns>
        public static object GetSingleResult(string sql, params SqlParameter[] param)
        {
            SqlConnection conn = new SqlConnection(connString);
            SqlCommand cmd = new SqlCommand(sql,conn);
            if (param != null && param.Length > 0)
            {
                //添加参数
                cmd.Parameters.AddRange(param);
            }
            try
            {
                //打开数据库
                conn.Open();
                return cmd.ExecuteScalar();
            }
            catch (Exception ex)
            {

                throw ex;
            }
            finally { 
                //关闭数据库
                conn.Close();
            }
            
        }


        /// <summary>
        /// 获取读取器
        /// </summary>
        /// <param name="sql"></param>
        /// <returns></returns>
        public static SqlDataReader GetReader(string sql, params SqlParameter[] param)
        {
            SqlConnection conn = new SqlConnection(connString);
            SqlCommand cmd = new SqlCommand(sql,conn);
            if (param != null && param.Length > 0)
            {
                //添加参数
                cmd.Parameters.AddRange(param);
            }
            try
            {
                //打开数据库
                conn.Open();
                return cmd.ExecuteReader(CommandBehavior.CloseConnection);
            }
            catch (Exception ex)
            {
                
                throw ex;
            }
            
        }



        /// <summary>
        /// 获取数据集
        /// </summary>
        /// <param name="sql">sql语句</param>
        /// <param name="param">sql参数</param>
        /// <returns></returns>
        public static DataSet GetDataSet(string sql,params SqlParameter[] param) {
            SqlConnection conn = new SqlConnection(connString);
            SqlCommand cmd = new SqlCommand(sql, conn);
            if(param!=null&&param.Length>0){
                cmd.Parameters.AddRange(param);
            }
            SqlDataAdapter adaper = new SqlDataAdapter(cmd);
            DataSet ds = new DataSet();
            try
            {
                adaper.Fill(ds);
                return ds;
            }
            catch (Exception ex)
            {
                
                throw ex;
            }
            
        }


       /// <summary>
        /// 数据库更新操作,如:增、删、改,通过存储过程
       /// </summary>
       /// <param name="procedureName">存储过程名称</param>
       /// <param name="param">存储过程参数</param>
       /// <returns></returns>
        public static int UpdateByProcedure(string procedureName,params SqlParameter []param) {
            SqlConnection conn = new SqlConnection(connString);
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = conn;
            //声明为存储过程
            cmd.CommandType = CommandType.StoredProcedure;
            //指明存储过程名称
            cmd.CommandText = procedureName;
            if(param!=null&&param.Length>0){
                //添加参数
                cmd.Parameters.AddRange(param);
            }
            try
            {
                //打开数据库
                conn.Open();
                return cmd.ExecuteNonQuery();
            }
            catch (Exception ex)
            {

                throw ex;
            }
            finally { 
                //关闭数据库
                conn.Close();
            }
            
        }


        /// <summary>
        /// 获取单一结果,通过存储过程
        /// </summary>
        /// <param name="procedureName">存储过程名称</param>
        /// <param name="param">存储过程参数</param>
        /// <returns></returns>
        public static object GetSingleResultByProcedure(string procedureName,params SqlParameter []param) {
            SqlConnection conn = new SqlConnection(connString);
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = conn;
            //声明为存储过程
            cmd.CommandType = CommandType.StoredProcedure;
            //指明存储过程名称
            cmd.CommandText = procedureName;
            if (param != null && param.Length > 0)
            {
                //添加参数
                cmd.Parameters.AddRange(param);
            }
            try
            {
                //打开数据库
                conn.Open();
                return cmd.ExecuteScalar();
            }
            catch (Exception ex)
            {

                throw ex;
            }
            finally
            {
                //关闭数据库
                conn.Close();
            }
            
        }


        /// <summary>
        /// 获取读取器,通过存储过程
        /// </summary>
        /// <param name="procedureName">存储过程名称</param>
        /// <param name="param">存储过程参数</param>
        /// <returns></returns>
        public static SqlDataReader GetReaderByProcedure(string procedureName, params SqlParameter[] param)
        {
            SqlConnection conn = new SqlConnection(connString);
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = conn;
            //声明为存储过程
            cmd.CommandType = CommandType.StoredProcedure;
            //指明存储过程名称
            cmd.CommandText = procedureName;
            if (param != null && param.Length > 0)
            {
                //添加参数
                cmd.Parameters.AddRange(param);
            }

            try
            {
                //打开数据库
                conn.Open();
                return cmd.ExecuteReader(CommandBehavior.CloseConnection);
            }
            catch (Exception ex)
            {
                
                throw ex;
            }
            
        }


        /// <summary>
        /// 获取数据集,通过存储过程
        /// </summary>
        /// <param name="procedureName">存储过程名称</param>
        /// <param name="param">存储过程参数</param>
        /// <returns></returns>
        public static DataSet GetDataSetByProcedure(string procedureName, params SqlParameter[] param)
        {
            SqlConnection conn = new SqlConnection(connString);
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = conn;
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = procedureName;
            if (param != null && param.Length > 0)
            {
                cmd.Parameters.AddRange(param);
            }
            SqlDataAdapter adaper = new SqlDataAdapter(cmd);
            DataSet ds = new DataSet();
            try
            {
                adaper.Fill(ds);
                return ds;
            }
            catch (Exception ex)
            {

                throw ex;
            }

        }



        /// <summary>
        /// 通过事务的方式执行批量sql语句
        /// </summary>
        /// <param name="sqlList">要执行的批量sql语句</param>
        /// <param name="param">sql参数</param>
        /// <returns></returns>
        public static int UpdateByTransaction(string []sqlList,params SqlParameter []param) {
            SqlConnection conn = new SqlConnection(connString);
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = conn;
            if(param!=null&&param.Length>0){
                cmd.Parameters.AddRange(param);
            }
     
            try
            {
                //打开数据库
                conn.Open();
                //开启事务
                cmd.Transaction=conn.BeginTransaction();
                int executeResult = 0;
                //遍历执行sql语句
                foreach (string sql in sqlList)
                {
                    cmd.CommandText = sql;
                    executeResult += cmd.ExecuteNonQuery();
                }
                //都执行成功,则提交事务
                cmd.Transaction.Commit();
                return executeResult;
            }
            catch (Exception ex)
            {
                //回滚事务
                if(cmd.Transaction!=null){
                    cmd.Transaction.Rollback();
                }
                throw ex;
            }
            finally { 
                //清空事务
                if(cmd.Transaction!=null){
                    cmd.Transaction = null;
                }
                //关闭数据库
                conn.Close();
            }
           
           
        }
        
        
        
                                                                        
        
        /// <summary>
        /// 数据库连接测试
        /// </summary>
        /// <returns></returns>
        public static int DataBaseLinkTest() {
            SqlConnection conn = new SqlConnection(connString);
            try
            {
                conn.Open();
                return 1;
            }
            catch (Exception)
            {

                return -1;
            }
            finally {
                conn.Close();
            }
           
        }
    }
}

网上找的一个SqlHelper类,如下:

/*****
 * 
 *    1 为使用ConfigurationManager类需要添加System.Configuration 
 * 
 * 
 * 
 * 
 */

using System;
using System.Collections.Generic;
using System.Configuration;             //需要引入的命名空间
using System.Data;                     //需要引入的命名空间
using System.Data.SqlClient;            //需要引入的命名空间
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SqlHelperTest
{
    class SqlHelper
    {
        public SqlHelper() {}
         
        public static string GetSqlConnectionString()
        {
            return ConfigurationManager.ConnectionStrings["Sql"].ConnectionString;
        }


        public static int ExecuteNonQuery(string sqlText, params SqlParameter[] parameters)
        {
            using (SqlConnection conn = new SqlConnection(GetSqlConnectionString()))
            {
                using (SqlCommand cmd = conn.CreateCommand())
                {
                    conn.Open();  //打开数据库
                    cmd.CommandText = sqlText;  //对CommandText进行赋值
                    cmd.Parameters.AddRange(parameters);  //对数据库使用参数进行赋值
                    return cmd.ExecuteNonQuery();
                }
            }
        }

        public static object ExecuteScalar(string sqlText, params SqlParameter[] parameters)
        {
            using (SqlConnection conn = new SqlConnection(GetSqlConnectionString()))
            {
                using (SqlCommand cmd = conn.CreateCommand())
                {
                    conn.Open();
                    cmd.CommandText = sqlText;
                    cmd.Parameters.AddRange(parameters);
                    return cmd.ExecuteScalar();
                }
            }
        }


        public static DataTable ExecuteDataTable(string sqlText, params SqlParameter[] parameters)
        {
            using (SqlDataAdapter adapter = new SqlDataAdapter(sqlText, GetSqlConnectionString()))
            {
                DataTable dt = new DataTable();
                adapter.SelectCommand.Parameters.AddRange(parameters);
                adapter.Fill(dt);
                return dt;
            }
        }


        public static SqlDataReader ExecuteReader(string sqlText, params SqlParameter[] parameters)
        {
            //SqlDataReader要求,它读取数据的时候有,它独占它的SqlConnection对象,而且SqlConnection必须是Open状态
            SqlConnection conn = new SqlConnection(GetSqlConnectionString());//不要释放连接,因为后面还需要连接打开状态
            SqlCommand cmd = conn.CreateCommand();
            conn.Open();
            cmd.CommandText = sqlText;
            cmd.Parameters.AddRange(parameters);
            //CommandBehavior.CloseConnection当SqlDataReader释放的时候,顺便把SqlConnection对象也释放掉
            return cmd.ExecuteReader(CommandBehavior.CloseConnection);
        }



    }
}

编辑App.config节点,添加<connectionStrings>节点,并根据实际填上相应的参数

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
    </startup>

     <connectionStrings>
        <add name="Sql" connectionString="server=数据库地址;uid=用户名;pwd=密码;database=数据库名称"/>
    </connectionStrings>
</configuration>

SqlHelper类加强版,下面以该类中的一个方法ExecuteDataTable为例进行说明:

为了清晰可见,我把SqlHelper类中其它的方法全删了,编辑如下:

/*****
 * 
 *    1 为使用ConfigurationManager类需要添加System.Configuration 
 * 
 * 
 * 
 * 
 */

using System;
using System.Collections.Generic;
using System.Configuration;             //需要引入的命名空间
using System.Data;                     //需要引入的命名空间
using System.Data.SqlClient;            //需要引入的命名空间
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace SqlHelperTest
{
    class SqlHelper
    {
        public SqlHelper() {}
         
        public static string GetSqlConnectionString()
        {
            return ConfigurationManager.ConnectionStrings["Sql"].ConnectionString;
        }


      

        public static IList<T> ExecuteDataTable<T>(string sqlText, params SqlParameter[] parameters) where T:class,new()
        {
            using (SqlDataAdapter adapter = new SqlDataAdapter(sqlText, GetSqlConnectionString()))
            {
                DataTable dt = new DataTable();
                adapter.SelectCommand.Parameters.AddRange(parameters);
                adapter.Fill(dt);

                //定义一个业务对象集合
                IList<T> modelList = new List<T>();
                //获取T类型实体的属性类型的值
                PropertyInfo[] pis = typeof(T).GetProperties();
                for (int row = 0; row < dt.Rows.Count;row++)
                {
                    //定义一个业务对象
                    T model = new T();
                    //为业务对象的属性赋值
                    foreach (var pi in pis)
                    {
                        //这样的复制方法是反射机制特有的,动态为属性赋值
                        pi.SetValue(model, dt.Rows[row][pi.Name], null);
                    }
                    modelList.Add(model);
                }

                return modelList;
            }
        }


      


    }
}

测试前准备:

添加一个名为tb_Student的数据库,同时在其下面添加两张表tb_StuInfo,tb_teacherInfo

在tb_StuInfo表添加信息如下:

在tb_teacherInfo表添加信息如下:

测试一:

在新建实体类StuInfo如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SqlHelperTest.Model
{
    public class StuInfo
    {
        public StuInfo() { }
        public int stuID {set;get; }
        public string stuName { set; get; }
        public string stuSex { set; get; }
        public string stuHobby { set; get; }
    }
}

在控制台程序测试代码如下:

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SqlHelperTest.Model;

namespace SqlHelperTest
{
    class Program
    {
        static void Main(string[] args)
        {

            //查询tb_StuInfo表中的所有数据,并显示出来
            string sql = "select * from tb_StuInfo";
            try
            {
                IList<StuInfo> stuInfoList = SqlHelper.ExecuteDataTable<StuInfo>(sql);
                foreach (var stuInfo in stuInfoList)
                {
                    Console.WriteLine("ID: " + stuInfo.stuID + "  Name:" + stuInfo.stuName +
                        "  Sex:" + stuInfo.stuSex + "  Hobby:" + stuInfo.stuHobby);
                }
            }
            catch (Exception)
            {

                Console.WriteLine("查询失败");
            }


          

        }
    }
}

运行结果如下:

测试二:

在新建实体类teacherInfo如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SqlHelperTest.Model
{
    public class teacherInfo
    {
        public int teacher_ID { set; get; }
        public string teacher_Name { set; get; }
        public int teacher_Age { set; get; }
    }
}

在控制台程序测试代码如下:

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SqlHelperTest.Model;

namespace SqlHelperTest
{
    class Program
    {
        static void Main(string[] args)
        {
      
            //查询tb_teacherInfo所有的信息,并打印出来
            string sql = "select * from tb_teacherInfo";
            try
            {
                IList<teacherInfo> teacherInfoList = SqlHelper.ExecuteDataTable<teacherInfo>(sql);
                foreach (var teacherInfo in teacherInfoList)
                {
                    Console.WriteLine("ID: " + teacherInfo.teacher_ID + "  Name:" + teacherInfo.teacher_Name +
                       " Age:" + teacherInfo.teacher_Age);
                }
            }
            catch (Exception)
            {

                Console.WriteLine("查询失败");
            }

         
        }
    }
}

运行结果如下:

通过上面两个测试,可以看出,并不需要修改SqlHelper类就可以操作不同的表对应的实体类,这样的好处是并不是直接操作DataTable,而是转去操作对应的实体类,这样更贴近业务。

SqlHelper类的其它方法就演示了

小伙伴们可能有不知道我在讲啥的感觉,没关系,你可以参考:

大话代码架构(田伟、郎小娇著):书中的第25页到33页

里面有详细的问题描述

发布了66 篇原创文章 · 获赞 48 · 访问量 16万+

猜你喜欢

转载自blog.csdn.net/zxy13826134783/article/details/86240640