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