以前用的SQL帮助类用着不怎么顺手,就用业余时间又写了一个。
重写后执行效率和资源占用相较之前用的那个有所优化,增加了几个新功能。
1,可以自动识别SQL语句的类型,简单说就是调用方法时不需要再指定CommandType的值了,无论是语句还是存储过程,直接用就行了。
2,增加了执行事务的能力。
3,提高了健壮性,本次SQL查询失败导致的链接未关闭不会引起其他后续语句的执行异常。
4,提供了一种新的使用SQL帮助类的模式,这种模式下数据库连接的打开可关闭需要手动操作,不过可以在打开关闭一次连接中执行多条SQL语句,提高了效率。
希望大家指出其中的不足以利于改进。
废话多说了,上代码:
using System;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
namespace Helper.DB.SqlServer
{
/// <summary>
/// SQL Server数据库帮助类
/// </summary>
public class DbHelper
{
#region 私有成员
/// <summary>
/// 数据库连接对象
/// </summary>
private SqlConnection connection;
/// <summary>
/// SQLCommand对象
/// </summary>
private SqlCommand command;
/// <summary>
/// SQLDataAdapter对象,用来填充数据表。
/// </summary>
private SqlDataAdapter dataAdapter;
#endregion
#region 公共属性
/// <summary>
/// 数据库连接的连接字符串
/// </summary>
public string ConnectionString
{
get { return connection.ConnectionString; }
}
/// <summary>
/// 数据库连接状态
/// </summary>
public string ConnectionState
{
get { return connection.State.ToString(); }
}
#endregion
#region 公共方法
#region 构造方法
/// <summary>
/// DbHelper构造方法,提供一个连接字符串来初始化连接对象。
/// </summary>
/// <param name="connectionString">数据库连接字符串</param>
public DbHelper(string connectionString)
{
connection = new SqlConnection(connectionString);
command = new SqlCommand("", connection);
dataAdapter = new SqlDataAdapter(command);
}
/// <summary>
/// DbHelper构造方法,从web.config文件中读取连接字符串。
/// </summary>
/// <param name="name">配置节点的name属性</param>
/// <param name="connectionStringSourceType">读取方向,是在appSettings中还是在connectionStrings中读取</param>
public DbHelper(string name, ConnectionStringSourceType connectionStringSourceType)
{
string connectionStringFromWebConfig;
switch (connectionStringSourceType)
{
case ConnectionStringSourceType.AppSettings:
connectionStringFromWebConfig = ConfigurationManager.AppSettings[name].ToString();
break;
case ConnectionStringSourceType.ConnectionStrings:
connectionStringFromWebConfig = ConfigurationManager.ConnectionStrings[name].ToString();
break;
default:
throw new Exception("构造方法没有提供给ConnectionStringSourceType." + connectionStringSourceType + "的操作语句。");
}
connection = new SqlConnection(connectionStringFromWebConfig);
command = new SqlCommand("", connection);
dataAdapter = new SqlDataAdapter(command);
}
#endregion
#region 连接管理
/// <summary>
/// 打开数据库连接
/// </summary>
public void OpenConnection()
{
if (connection.State != System.Data.ConnectionState.Open)
connection.Open();
}
/// <summary>
/// 关闭数据库连接
/// </summary>
public void CloseConnection()
{
connection.Close();
}
#endregion
#region 事务
/// <summary>
/// 开始执行事务
/// </summary>
public void TransactionStart()
{
command.Transaction = connection.BeginTransaction();
}
/// <summary>
/// 提交事务
/// </summary>
public void TransactionCommit()
{
command.Transaction.Commit();
}
/// <summary>
/// 回滚事务
/// </summary>
public void TransactionRollback()
{
command.Transaction.Rollback();
}
#endregion
#region 执行
/// <summary>
/// 执行SQL语句或存储过程,用来执行insert,update,delete语句
/// </summary>
/// <param name="commandText">SQL语句</param>
/// <param name="parameters">SQL语句所需要的参数集合</param>
/// <returns>int,受影响的行数</returns>
public int ExecuteNonQuery(string commandText, params SqlParameter[] parameters)
{
setCommand(commandText, parameters);
if (connection.State != System.Data.ConnectionState.Open) connection.Open();
int count = command.ExecuteNonQuery();
connection.Close();
return count;
}
/// <summary>
/// 执行SQL语句或存储过程,用来执行insert,update,delete语句
/// </summary>
/// <param name="commandText">SQL语句</param>
/// <returns>int,受影响的行数</returns>
public int ExecuteNonQuery(string commandText)
{
setCommand(commandText);
if (connection.State != System.Data.ConnectionState.Open) connection.Open();
int count = command.ExecuteNonQuery();
connection.Close();
return count;
}
/// <summary>
/// 执行SQL语句或存储过程,用来执行insert,update,delete语句,不自动打开或关闭数据库连接
/// </summary>
/// <param name="commandText">SQL语句</param>
/// <param name="parameters">SQL语句所需要的参数集合</param>
/// <returns>int,受影响的行数</returns>
public int ExecuteNonQueryNonManageConnection(string commandText, params SqlParameter[] parameters)
{
setCommand(commandText, parameters);
return command.ExecuteNonQuery();
}
/// <summary>
/// 执行SQL语句或存储过程,用来执行insert,update,delete语句,不自动打开或关闭数据库连接
/// </summary>
/// <param name="commandText">SQL语句</param>
/// <returns>int,受影响的行数</returns>
public int ExecuteNonQueryNonManageConnection(string commandText)
{
setCommand(commandText);
return command.ExecuteNonQuery();
}
#endregion
#region 查询
#region DataTable
/// <summary>
/// 执行查询语句或存储过程,返回DataTable
/// </summary>
/// <param name="commandText">SQL查询语句</param>
/// <param name="parameters">SQL语句所需要的参数集合</param>
/// <returns>返回DataTable形式的查询数据</returns>
public DataTable QueryAsDataTable(string commandText, params SqlParameter[] parameters)
{
setCommand(commandText, parameters);
DataTable dt = new DataTable();
if (connection.State != System.Data.ConnectionState.Open) connection.Open();
dataAdapter.Fill(dt);
connection.Close();
return dt;
}
/// <summary>
/// 执行查询语句或存储过程,返回DataTable
/// </summary>
/// <param name="commandText">SQL查询语句</param>
/// <returns>返回DataTable形式的查询数据</returns>
public DataTable QueryAsDataTable(string commandText)
{
setCommand(commandText);
DataTable dt = new DataTable();
if (connection.State != System.Data.ConnectionState.Open) connection.Open();
dataAdapter.Fill(dt);
connection.Close();
return dt;
}
/// <summary>
/// 执行查询语句或存储过程,返回DataTable,不自动打开或关闭数据库连接
/// </summary>
/// <param name="commandText">SQL查询语句</param>
/// <param name="parameters">SQL语句所需要的参数集合</param>
/// <returns>返回DataTable形式的查询数据</returns>
public DataTable QueryAsDataTableNonManageConnection(string commandText, params SqlParameter[] parameters)
{
setCommand(commandText, parameters);
DataTable dt = new DataTable();
dataAdapter.Fill(dt);
return dt;
}
/// <summary>
/// 执行查询语句或存储过程,返回DataTable,不自动打开或关闭数据库连接
/// </summary>
/// <param name="commandText">SQL查询语句</param>
/// <returns>返回DataTable形式的查询数据</returns>
public DataTable QueryAsDataTableNonManageConnection(string commandText)
{
setCommand(commandText);
DataTable dt = new DataTable();
dataAdapter.Fill(dt);
return dt;
}
#endregion
#region Single
/// <summary>
/// 执行查询语句或存储过程,返回第一行第一列的单个数据
/// </summary>
/// <param name="commandText">SQL查询语句</param>
/// <param name="parameters">SQL语句所需要的参数集合</param>
/// <returns>返回查询单个数据的Object对象</returns>
public object QueryAsSingle(string commandText, params SqlParameter[] parameters)
{
setCommand(commandText, parameters);
if (connection.State != System.Data.ConnectionState.Open) connection.Open();
object returnObject = command.ExecuteScalar();
connection.Close();
return returnObject;
}
/// <summary>
/// 执行查询语句或存储过程,返回第一行第一列的单个数据
/// </summary>
/// <param name="commandText">SQL查询语句</param>
/// <returns>返回查询单个数据的Object对象</returns>
public object QueryAsSingle(string commandText)
{
setCommand(commandText);
if (connection.State != System.Data.ConnectionState.Open) connection.Open();
object returnObject = command.ExecuteScalar();
connection.Close();
return returnObject;
}
/// <summary>
/// 执行查询语句或存储过程,返回第一行第一列的单个数据,不自动打开或关闭数据库连接
/// </summary>
/// <param name="commandText">SQL查询语句</param>
/// <param name="parameters">SQL语句所需要的参数集合</param>
/// <returns>返回查询单个数据的Object对象</returns>
public object QueryAsSingleNonManageConnection(string commandText, params SqlParameter[] parameters)
{
setCommand(commandText, parameters);
return command.ExecuteScalar();
}
/// <summary>
/// 执行查询语句或存储过程,返回第一行第一列的单个数据,不自动打开或关闭数据库连接
/// </summary>
/// <param name="commandText">SQL查询语句</param>
/// <returns>返回查询单个数据的Object对象</returns>
public object QueryAsSingleNonManageConnection(string commandText)
{
setCommand(commandText);
return command.ExecuteScalar();
}
#endregion
#endregion
#endregion
#region 私有方法
/// <summary>
/// 自动判断SQL语句是SQL语句还是存储过程
/// </summary>
/// <param name="commandText">待判断SQL字符串</param>
/// <returns>CommandType类型,返回值有Text,StoredProcedure</returns>
private CommandType switchCommandType(string commandText)
{
//commandText = "Display_Directory_GetListByParentDirID";
//throw new Exception(commandText + "_" + commandText.IndexOfAny(new char[] { ' ', '\r' }).ToString());
int index = commandText.IndexOfAny(new char[] { ' ', '\r' });
if (commandText.Length > 0)
{
switch (commandText.Substring(0, commandText.Length - (commandText.Length - (index>0?index:0) )).ToLower())
{
case "select":
case "insert":
case "delete":
case "update":
case "create":
case "alter":
case "drop":
return CommandType.Text;
default:
return CommandType.StoredProcedure;
}
}
else
{
throw new Exception("sql语句不能为空");
}
}
/// <summary>
/// 设置command对象
/// </summary>
/// <param name="commandText">SQL语句</param>
private void setCommand(string commandText)
{
command.Parameters.Clear();
command.CommandType = switchCommandType(commandText);
command.CommandText = commandText;
}
/// <summary>
/// 设置command对象
/// </summary>
/// <param name="commandText">SQL语句</param>
/// <param name="parameters">SQL参数</param>
private void setCommand(string commandText, params SqlParameter[] parameters)
{
command.Parameters.Clear();
command.CommandType = switchCommandType(commandText);
command.CommandText = commandText;
command.Parameters.AddRange(parameters);
}
#endregion
~DbHelper()
{
command.Dispose();
}
}
/// <summary>
/// 数据库连接字符串源类型枚举
/// </summary>
public enum ConnectionStringSourceType
{
AppSettings,
ConnectionStrings
}
}
来源:https://www.cnblogs.com/Silentdance/p/3301111.html