优点:
1、强大的查询公用方法,如支持返回泛型实体对象集合,泛型值类型集合,实体对象,数据集等。
2、所有方法都支持参数化与非参数化访问db,调用十分方便。
3、使用了线程本地存储,使之能支持在业务逻辑层显式控制事务。
4、注释较为详细,方法较为简洁(加上注释总共200多行代码)。
5、开源,容易修改。
缺点:
暂时仅支持sqlserver数据库。
源代码:

public class SqlHelper
{
public string connectionString = System.Configuration.ConfigurationManager.AppSettings["ConnectionString"];
private SqlConnection _connection;
public SqlConnection connection
{
get { return _connection; }
set { _connection = value; }
}
private SqlTransaction _transaction;
public SqlTransaction transaction
{
get { return _transaction; }
set { _transaction = value; ;}
}
private SqlHelper()
{
}
/// <summary>
/// 如果当前线程已经存在SqlHelper则使用当前线程的SqlHelper,否则重新创建一个SqlHelper
/// </summary>
/// <returns></returns>
public static SqlHelper Instance()
{
object obj = Thread.GetData(Thread.GetNamedDataSlot("SqlHelper"));
if (obj == null)
{
SqlHelper helper = new SqlHelper();
Thread.SetData(Thread.GetNamedDataSlot("SqlHelper"), helper);
return helper;
}
return (SqlHelper)obj;
}
/// <summary>
/// 打开数据库连接
/// </summary>
public void OpenConnection()
{
if (connection == null) connection = new SqlConnection(connectionString);
if (connection.State != ConnectionState.Open)
connection.Open();
}
/// <summary>
/// 开启事务
/// </summary>
public void BeginTransaction()
{
OpenConnection();
if (transaction == null)
transaction = connection.BeginTransaction();
}
/// <summary>
/// 提交事务 并且 释放并关闭资源
/// </summary>
public void CommitTransaction()
{
if (transaction != null)
{
transaction.Commit();
transaction.Dispose();
transaction = null;
Dispose();
}
}
/// <summary>
/// 回滚事务 并且 释放并关闭资源
/// </summary>
public void RollbackTransaction()
{
if (transaction != null)
{
transaction.Rollback();
transaction.Dispose();
transaction = null;
Dispose();
}
}
/// <summary>
/// 如果没有开启事务就自动释放资源,关闭连接,否则在提交或回滚事务的时候释放
/// </summary>
public void Dispose()
{
if (transaction == null)
{
if (connection != null)
{
connection.Dispose();
connection.Close();
connection = null;
}
}
}
private SqlCommand CreateCommand(CommandType cmdType, string cmdText, params SqlParameter[] cmdParas)
{
SqlCommand mand = connection.CreateCommand();
mand.CommandText = cmdText;
mand.CommandType = cmdType;
mand.Parameters.AddRange(cmdParas);
if (transaction != null) mand.Transaction = transaction;
return mand;
}
/// <summary>
/// 返回一个数据集
/// </summary>
/// <param name="cmdType"></param>
/// <param name="cmdText"></param>
/// <param name="cmdParas"></param>
/// <returns></returns>
public DataSet ExecuteDataSet(CommandType cmdType, string cmdText, params SqlParameter[] cmdParas)
{
try
{
OpenConnection();
SqlCommand mand = CreateCommand(cmdType, cmdText, cmdParas);
SqlDataAdapter data = new SqlDataAdapter(mand);
DataSet ds = new DataSet();
data.Fill(ds);
return ds;
}
catch (Exception ex) { throw ex; }
finally { Dispose(); }
}
/// <summary>
/// 返回受影响的行数
/// </summary>
/// <param name="cmdType"></param>
/// <param name="cmdText"></param>
/// <param name="cmdParas"></param>
/// <returns></returns>
public int ExecuteNonQuery(CommandType cmdType, string cmdText, params SqlParameter[] cmdParas)
{
try
{
OpenConnection();
SqlCommand mand = CreateCommand(cmdType, cmdText, cmdParas);
return mand.ExecuteNonQuery();
}
catch (Exception ex) { throw ex; }
finally { Dispose(); }
}
/// <summary>
/// 返回结果集中第一行第一列
/// </summary>
/// <param name="cmdType"></param>
/// <param name="cmdText"></param>
/// <param name="cmdParas"></param>
/// <returns></returns>
public object ExecuteScalar(CommandType cmdType, string cmdText, params SqlParameter[] cmdParas)
{
try
{
OpenConnection();
SqlCommand mand = CreateCommand(cmdType, cmdText, cmdParas);
return mand.ExecuteScalar();
}
catch (Exception ex) { throw ex; }
finally { Dispose(); }
}
/// <summary>
/// 返回泛型集合
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="cmdType"></param>
/// <param name="cmdText"></param>
/// <param name="cmdParas"></param>
/// <returns></returns>
public IList<T> ExecuteReaderList<T>(CommandType cmdType, string cmdText, params SqlParameter[] cmdParas)
{
try
{
OpenConnection();
SqlCommand mand = CreateCommand(cmdType, cmdText, cmdParas);
SqlDataReader reader = mand.ExecuteReader();
IList<T> list = ToList<T>(reader);
return list;
}
catch (Exception ex) { throw ex; }
finally { Dispose(); }
}
/// <summary>
/// 返回一个对象 如数据库无结果返回将抛出异常
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="cmdType"></param>
/// <param name="cmdText"></param>
/// <param name="cmdParas"></param>
/// <returns></returns>
public T ExecuteReaderObject<T>(CommandType cmdType, string cmdText, params SqlParameter[] cmdParas)
{
return ExecuteReaderList<T>(cmdType, cmdText, cmdParas)[0];
}
/// <summary>
/// 反射创建泛型集合
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="reader"></param>
/// <returns></returns>
private IList<T> ToList<T>(SqlDataReader reader)
{
Type type = typeof(T);
IList<T> list = null;
if (type.IsValueType || type == typeof(string))
list = CreateValue<T>(reader, type);
else
list = CreateObject<T>(reader, type);
reader.Dispose();
reader.Close();
return list;
}
private IList<T> CreateObject<T>(SqlDataReader reader, Type type)
{
IList<T> list = new List<T>();
PropertyInfo[] properties = type.GetProperties();
string name = string.Empty;
while (reader.Read())
{
T local = Activator.CreateInstance<T>();
for (int i = 0; i < reader.FieldCount; i++)
{
name = reader.GetName(i);
foreach (PropertyInfo info in properties)
{
if (name.Equals(info.Name))
{
info.SetValue(local, Convert.ChangeType(reader[info.Name], info.PropertyType), null);
break;
}
}
}
list.Add(local);
}
return list;
}
private IList<T> CreateValue<T>(SqlDataReader reader, Type type)
{
IList<T> list = new List<T>();
while (reader.Read())
{
T local = (T)Convert.ChangeType(reader[0], type, null);
list.Add(local);
}
return list;
}
}
{
public string connectionString = System.Configuration.ConfigurationManager.AppSettings["ConnectionString"];
private SqlConnection _connection;
public SqlConnection connection
{
get { return _connection; }
set { _connection = value; }
}
private SqlTransaction _transaction;
public SqlTransaction transaction
{
get { return _transaction; }
set { _transaction = value; ;}
}
private SqlHelper()
{
}
/// <summary>
/// 如果当前线程已经存在SqlHelper则使用当前线程的SqlHelper,否则重新创建一个SqlHelper
/// </summary>
/// <returns></returns>
public static SqlHelper Instance()
{
object obj = Thread.GetData(Thread.GetNamedDataSlot("SqlHelper"));
if (obj == null)
{
SqlHelper helper = new SqlHelper();
Thread.SetData(Thread.GetNamedDataSlot("SqlHelper"), helper);
return helper;
}
return (SqlHelper)obj;
}
/// <summary>
/// 打开数据库连接
/// </summary>
public void OpenConnection()
{
if (connection == null) connection = new SqlConnection(connectionString);
if (connection.State != ConnectionState.Open)
connection.Open();
}
/// <summary>
/// 开启事务
/// </summary>
public void BeginTransaction()
{
OpenConnection();
if (transaction == null)
transaction = connection.BeginTransaction();
}
/// <summary>
/// 提交事务 并且 释放并关闭资源
/// </summary>
public void CommitTransaction()
{
if (transaction != null)
{
transaction.Commit();
transaction.Dispose();
transaction = null;
Dispose();
}
}
/// <summary>
/// 回滚事务 并且 释放并关闭资源
/// </summary>
public void RollbackTransaction()
{
if (transaction != null)
{
transaction.Rollback();
transaction.Dispose();
transaction = null;
Dispose();
}
}
/// <summary>
/// 如果没有开启事务就自动释放资源,关闭连接,否则在提交或回滚事务的时候释放
/// </summary>
public void Dispose()
{
if (transaction == null)
{
if (connection != null)
{
connection.Dispose();
connection.Close();
connection = null;
}
}
}
private SqlCommand CreateCommand(CommandType cmdType, string cmdText, params SqlParameter[] cmdParas)
{
SqlCommand mand = connection.CreateCommand();
mand.CommandText = cmdText;
mand.CommandType = cmdType;
mand.Parameters.AddRange(cmdParas);
if (transaction != null) mand.Transaction = transaction;
return mand;
}
/// <summary>
/// 返回一个数据集
/// </summary>
/// <param name="cmdType"></param>
/// <param name="cmdText"></param>
/// <param name="cmdParas"></param>
/// <returns></returns>
public DataSet ExecuteDataSet(CommandType cmdType, string cmdText, params SqlParameter[] cmdParas)
{
try
{
OpenConnection();
SqlCommand mand = CreateCommand(cmdType, cmdText, cmdParas);
SqlDataAdapter data = new SqlDataAdapter(mand);
DataSet ds = new DataSet();
data.Fill(ds);
return ds;
}
catch (Exception ex) { throw ex; }
finally { Dispose(); }
}
/// <summary>
/// 返回受影响的行数
/// </summary>
/// <param name="cmdType"></param>
/// <param name="cmdText"></param>
/// <param name="cmdParas"></param>
/// <returns></returns>
public int ExecuteNonQuery(CommandType cmdType, string cmdText, params SqlParameter[] cmdParas)
{
try
{
OpenConnection();
SqlCommand mand = CreateCommand(cmdType, cmdText, cmdParas);
return mand.ExecuteNonQuery();
}
catch (Exception ex) { throw ex; }
finally { Dispose(); }
}
/// <summary>
/// 返回结果集中第一行第一列
/// </summary>
/// <param name="cmdType"></param>
/// <param name="cmdText"></param>
/// <param name="cmdParas"></param>
/// <returns></returns>
public object ExecuteScalar(CommandType cmdType, string cmdText, params SqlParameter[] cmdParas)
{
try
{
OpenConnection();
SqlCommand mand = CreateCommand(cmdType, cmdText, cmdParas);
return mand.ExecuteScalar();
}
catch (Exception ex) { throw ex; }
finally { Dispose(); }
}
/// <summary>
/// 返回泛型集合
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="cmdType"></param>
/// <param name="cmdText"></param>
/// <param name="cmdParas"></param>
/// <returns></returns>
public IList<T> ExecuteReaderList<T>(CommandType cmdType, string cmdText, params SqlParameter[] cmdParas)
{
try
{
OpenConnection();
SqlCommand mand = CreateCommand(cmdType, cmdText, cmdParas);
SqlDataReader reader = mand.ExecuteReader();
IList<T> list = ToList<T>(reader);
return list;
}
catch (Exception ex) { throw ex; }
finally { Dispose(); }
}
/// <summary>
/// 返回一个对象 如数据库无结果返回将抛出异常
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="cmdType"></param>
/// <param name="cmdText"></param>
/// <param name="cmdParas"></param>
/// <returns></returns>
public T ExecuteReaderObject<T>(CommandType cmdType, string cmdText, params SqlParameter[] cmdParas)
{
return ExecuteReaderList<T>(cmdType, cmdText, cmdParas)[0];
}
/// <summary>
/// 反射创建泛型集合
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="reader"></param>
/// <returns></returns>
private IList<T> ToList<T>(SqlDataReader reader)
{
Type type = typeof(T);
IList<T> list = null;
if (type.IsValueType || type == typeof(string))
list = CreateValue<T>(reader, type);
else
list = CreateObject<T>(reader, type);
reader.Dispose();
reader.Close();
return list;
}
private IList<T> CreateObject<T>(SqlDataReader reader, Type type)
{
IList<T> list = new List<T>();
PropertyInfo[] properties = type.GetProperties();
string name = string.Empty;
while (reader.Read())
{
T local = Activator.CreateInstance<T>();
for (int i = 0; i < reader.FieldCount; i++)
{
name = reader.GetName(i);
foreach (PropertyInfo info in properties)
{
if (name.Equals(info.Name))
{
info.SetValue(local, Convert.ChangeType(reader[info.Name], info.PropertyType), null);
break;
}
}
}
list.Add(local);
}
return list;
}
private IList<T> CreateValue<T>(SqlDataReader reader, Type type)
{
IList<T> list = new List<T>();
while (reader.Read())
{
T local = (T)Convert.ChangeType(reader[0], type, null);
list.Add(local);
}
return list;
}
}
调用示例:

/// <summary>
/// 事务示例
/// </summary>
public void TestExecuteNonQueryBeginTran()
{
try
{
SqlHelper.Instance().BeginTransaction();
SqlHelper.Instance().ExecuteNonQuery(CommandType.Text, "update warningTest set pid=0 where id=3");
SqlHelper.Instance().ExecuteNonQuery(CommandType.Text, "update warningTest set pid=aaa where id=4");
SqlHelper.Instance().CommitTransaction();
int num = SqlHelper.Instance().ExecuteNonQuery(System.Data.CommandType.Text, "select * from warningTest");
}
catch { SqlHelper.Instance().RollbackTransaction(); }
}
/// <summary>
/// 返回实体集合示例
/// </summary>
public void TestExecuteReaderList()
{
SqlParameter para = new SqlParameter("@id", 1);
warningTest warning = SqlHelper.Instance().ExecuteReaderObject<warningTest>(CommandType.Text, "select * from warningTest where id=@id", para);
Assert.AreEqual(1, warning.id);
}
/// <summary>
/// 返回值类型集合示例
/// </summary>
public void TestExecuteReaderListByInt()
{
IList<string> list = SqlHelper.Instance().ExecuteReaderList<string>(CommandType.Text, "select Logic from warningTest");
foreach (string i in list)
{
Console.WriteLine(i.ToString());
}
}
/// 事务示例
/// </summary>
public void TestExecuteNonQueryBeginTran()
{
try
{
SqlHelper.Instance().BeginTransaction();
SqlHelper.Instance().ExecuteNonQuery(CommandType.Text, "update warningTest set pid=0 where id=3");
SqlHelper.Instance().ExecuteNonQuery(CommandType.Text, "update warningTest set pid=aaa where id=4");
SqlHelper.Instance().CommitTransaction();
int num = SqlHelper.Instance().ExecuteNonQuery(System.Data.CommandType.Text, "select * from warningTest");
}
catch { SqlHelper.Instance().RollbackTransaction(); }
}
/// <summary>
/// 返回实体集合示例
/// </summary>
public void TestExecuteReaderList()
{
SqlParameter para = new SqlParameter("@id", 1);
warningTest warning = SqlHelper.Instance().ExecuteReaderObject<warningTest>(CommandType.Text, "select * from warningTest where id=@id", para);
Assert.AreEqual(1, warning.id);
}
/// <summary>
/// 返回值类型集合示例
/// </summary>
public void TestExecuteReaderListByInt()
{
IList<string> list = SqlHelper.Instance().ExecuteReaderList<string>(CommandType.Text, "select Logic from warningTest");
foreach (string i in list)
{
Console.WriteLine(i.ToString());
}
}
下载: 项目源代码
补充说明:数据库备份文件在Data.test\App_Data文件夹下面
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?