大神可以绕道了...
目的:搜集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&¶m.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&¶m.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&¶m.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&¶m.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页
里面有详细的问题描述