SqlHelper类(C#)

article/2025/9/18 14:29:32

大神可以绕道了...

目的:搜集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页

里面有详细的问题描述


http://chatgpt.dhexx.cn/article/2oU77xPF.shtml

相关文章

SQLHelper

前言 小编在最近的学习过程中用到了SQLHelper&#xff0c;说起来&#xff0c;小编也是有点懒&#xff0c;虽然是用到了&#xff0c;但是也没有用明白&#xff0c;开始的时候也没有好好的研究&#xff0c;直到后来报错了&#xff0c;才下定决心好好好学习了解一下这个东西。下面…

sqlhelper 的使用 (C#)超级详细的入门教程

sql helper 的使用 &#xff08;C#&#xff09;小白教程 提到CRUD&#xff0c;很多刚入门的小白总是来一条写一条连接&#xff0c;先建立连接connection 打开连接 open 来查询query 最后别忘了关闭连接 close 。 要是一次写多个操作&#xff0c;那一遍一遍写下来肯定麻木了。…

Python中的BIF

什么是BIF呢&#xff1f; BIF是built-in functions的缩写&#xff0c;顾名思义&#xff0c;就是内建函数。Python中提供了大量的BIF&#xff0c;这就意味着代码量可以大大减少。 如果要查看Python中的内建函数&#xff0c;就可以使用命令&#xff1a;dir(__builtins__) 注意…

一、bif

缩进是python的灵魂&#xff0c;缩进可以使python的代码整洁&#xff0c;有层次。 python是脚本语言&#xff0c;就是为了简单方便以辅助科学运算&#xff0c;因此python有许多bif&#xff0c;build in function 全部都是小写的就是bif。 转义字符是一个字符&#xff0c;在内存…

FineBI

还是数据可视化工具Tableau、FineBI? 不禁联想起在微软系统出现之前&#xff0c;程序员的电脑系统还是用的linux&#xff0c;只能通过各种复杂的指令来实现字符的简单可视化&#xff1b;而当win系统普及于世后&#xff0c;计算机从此突破了技术人群的限制&#xff0c;交互方式…

Python学习笔记2(小甲鱼)—— 内置函数BIF

&#xfeff;&#xfeff; 这里有一个让人“亮瞎眼”的“游戏”开始python的学习。首先我们编写一段代码&#xff0c;来实现这个游戏。编写操作可参考前面的《Python学习笔记1——搭建环境与“Hello World”》这篇文章&#xff0c;网址&#xff1a;http://blog.csdn.net/tongbi…

BSDiff算法

https://blog.csdn.net/add_ada/article/details/51232889 BSDiff是一个差量更新算法&#xff0c;它在服务器端运行BSDiff算法产生patch包&#xff0c;在客户端运行BSPatch算法&#xff0c;将旧文件和patch包合成新文件。 差量更新算法的核心思想 尽可能多的利用old文件中已有…

MFBI

MFBI MFBI: Multi-Frequency Band Indicator 之前在写” Carrier frequency 和 EARFCN的关系”, 提到过MFBI. 简单的讲就是不同band间对应的frequency 的范围之间有overlapping, 一个frequency 可能对应多个band. 比如2595MHz 即属于band38 又属于band41. 关于那些band间存…

Python的内置函数(BIF)与变量的使用

Python的内置函数&#xff08;BIF&#xff09;与变量的使用 1、内置函数 使用dir()可查看所有的内置函数 dir(__builtins__)使用help()可查看内置函数的功能&#xff0c;例如&#xff1a; help(UserWarning)2、input函数 作用是在控制台输入数据&#xff0c;返回的是字符串…

Python内置函数(BIF)查询(附中文详解说明)

我们知道&#xff0c;Python 解释器内置了一些常量和函数&#xff0c;叫做内置常量&#xff08;Built-in Constants&#xff09;和内置函数&#xff08;Built-in Functions&#xff09;&#xff0c;来实现各种不同的特定功能&#xff0c;在我的另外一篇博客中 第8章&#xff1a…

【BF算法】

BF 算法 BF 算法精讲 在学习到字符串的匹配问题时&#xff0c;了解到了BF算法和KMP算法。 对比这两个算法&#xff0c;先了解BF算法&#xff1b; 字符串匹配问题&#xff0c;比如说&#xff1a;有一个主串 “abbbcdef” &#xff0c; 子串 “bbc”&#xff0c;该问题就是在主…

BIF

python3的内置函数

Python中常见BIF及使用方法

前提说明&#xff1a; BIF&#xff1a;(built-in functions)内置函数 目的&#xff1a;为了方便程序员快速的编写程序 1.查看Python内置函数命令&#xff1a; dir(__builtins__) print(dir(__builtins__))结果如下&#xff1a; 2.help查看使用方法 如&#xff1a; hel…

认识BIF

1.打开IDLE窗口&#xff0c;file新建一个窗口&#xff0c;输入以下代码&#xff1a; 点击file&#xff0c;save保存&#xff0c;接着点击run&#xff0c;或者F5执行 Python对于缩进的命令很敏感&#xff0c;如果这样改就会错误 else后面的冒号可以智能进行缩进&#xff0c;回车…

python中的几个概念:BIF,函数,方法,模块,包,库

一、BIF&#xff08;built in founctions&#xff0c;内置函数&#xff09;&#xff1a;python自带函数&#xff0c;直接调用即可&#xff0c;python3自带函数如下&#xff1a; 二、函数&#xff08;function&#xff09;&#xff1a;就是方法&#xff0c;使用def 定义 三、模…

SQL优化面试专题

介绍&#xff1a; 无论您是创建Web应用程序的开发人员&#xff0c;还是参与Web测试的DBA或测试人员&#xff0c;SQL方面的技巧在数据库编程和数据库验证中都非常重要。因此&#xff0c;我们整理了QL性能优化方面的面试问题。 SQL性能优化是一项艰巨的任务&#xff0c;并且是处…

有哪些SQL优化的手段?

文章目录 1.1 SQL的性能分析1.1.1 通过 show status 命令了解各种 SQL 的执行频率1.1.2 慢查询日志1.1.3 profile分析1.1.4 通过 EXPLAIN 分析低效 SQL 的执行计划 1.2 常用的SQL语句优化 1.1 SQL的性能分析 当面对一个有 SQL 性能问题的数据库时&#xff0c;我们应该首先进行系…

SQL优化终于干掉了“distinct”

SQL优化之多表联合查询干掉“distinct”去重关键字 一、优化目的二、优化之前的sql长这样三、DISTINCT关键字的用法四、谈&#xff1a;如何优化distinct的sql五、distinct真的和group by等价吗&#xff1f;六、优化后的sql长啥样?七、总结2020.10.14更【来自评论区大佬的精彩观…

SQL关于Date类型时间段查询优化(时间跨度稍长)(记一次自己工作开发中遇到的SQL优化经验)

前言 以下用于SQL查询的数据均为测试环境的数据&#xff0c;关键数据都已打码。 背景 我们的日常开放中都会遇到 查询某个时间段的数据&#xff0c;像这样&#xff1a; select * from test(表名) where time BETWEEN 2022-08-20 00:00:00 AND 2022-09-19 00:00:00但如果时间…

MySql基础知识总结(SQL优化篇)

&#x1f345; 作者简介&#xff1a;CSDN2021博客之星亚军&#x1f3c6;、新星计划导师✌、博客专家&#x1f4aa; &#x1f345; 哪吒多年工作总结&#xff1a;Java学习路线总结&#xff0c;搬砖工逆袭Java架构师 &#x1f345; 关注公众号【哪吒编程】&#xff0c;回复1024&a…