工厂提供器DbProviderFactory 实现多种数据库类型类型的DBhelper
废话就不多说了。。直接上代码。。
希望还有什么不足之处 大家提出来。。
Code
public class DbHelper
{
public DbHelper()
{
}
/// 得到web.config里配置项的数据库连接字符串。
private static readonly string ConnectionString= ConfigurationManager.ConnectionStrings["ConnectionString"].ToString();
/// 得到工厂提供器类型
private static readonly string ProviderFactoryString= ConfigurationManager.ConnectionStrings["Provider"].ToString();
private static IDbConnection connection = null;
private static DbProviderFactory df = null;
/// <summary>
/// 创建工厂提供器并且
/// </summary>
private static IDbConnection CreateConnection()
{
df = DbProviderFactories.GetFactory(ProviderFactoryString);
connection = df.CreateConnection();
connection.ConnectionString = ConnectionString;
return connection;
}
/// <summary>
/// 创建命令对象
/// </summary>
/// <returns></returns>
private static IDbCommand CreateDbCommand()
{
IDbConnection con= CreateConnection();//创建工厂提供器并且
IDbCommand cmd = df.CreateCommand();
cmd.Connection = con;
return cmd;
}
/// <summary>
/// 创建Adapter对象
/// </summary>
/// <returns></returns>
private static IDbDataAdapter CarateAderDataAdapter()
{
IDbConnection con = CreateConnection();//创建工厂提供器并且
IDbDataAdapter Adapter = df.CreateDataAdapter();
return Adapter;
}
/// <summary>
/// 准备命令参数
/// </summary>
/// <param name="cmd">IDbCommand 命令对象</param>
/// <param name="con">数据库连接对象</param>
/// <param name="comType">解释命令字符串</param>
/// <param name="comText">命令文本</param>
/// <param name="parameter">数据操作命令参数化</param>
/// <returns></returns>
private static void PrepareCommand(IDbCommand cmd, IDbConnection con, IDbTransaction trans, CommandType comType, string comText, params IDbDataParameter[] parameter)
{
if (con.State != ConnectionState.Open)
con.Open();
cmd.Connection = con;
cmd.CommandType = comType;
cmd.CommandText = comText;
if (trans != null)
cmd.Transaction = trans;
if (parameter != null)
{
foreach (IDbDataParameter p in parameter)
{
// 检查未分配值的输出参数,将其分配以DBNull.Value.
if ((p.Direction == ParameterDirection.InputOutput || p.Direction == ParameterDirection.Input) &&
(p.Value == null))
{
p.Value = DBNull.Value;
}
cmd.Parameters.Add(p);
}
}
}
/// <summary>
/// 执行增删改命令 cmdType参数是否调用存储过程。 为true 调用存储过程,false为sql语句
/// </summary>
/// <param name="cmdType">True为存储,False为文本</param>
/// <param name="comText">命令语句</param>
/// <param name="parameter">命令参数</param>
/// <returns>返回影响行数</returns>
public static int ExecuteNonQuery(string cmdText,bool cmdType, params IDbDataParameter[] parameter)
{
using (IDbConnection con = CreateConnection())
{
IDbCommand cmd = CreateDbCommand();
CommandType type = CommandType.Text;
if (cmdType)
type = CommandType.StoredProcedure; //存储过程
PrepareCommand(cmd, con, null, type, cmdText, parameter);
int i= cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
return i;
}
}
/// <summary>
/// 轻量级查询,返回第一行第一列,失败或异常返回NULL
/// </summary>
/// <param name="cmdText">命令文本</param>
/// <param name="parameter">命令参数化</param>
/// <returns></returns>
public static object ExecuteScalar(string cmdText, params IDbDataParameter[] parameter)
{
using (IDbConnection con = CreateConnection())
{
IDbCommand cmd = CreateDbCommand();
PrepareCommand(cmd, con, null, CommandType.Text, cmdText, parameter);
object val = cmd.ExecuteScalar();
cmd.Parameters.Clear();
return val;
}
}
/// <summary>
/// 执行查询,cmdType参数是否调用存储过程。 为true 调用存储过程,false为sql语句
/// </summary>
/// <param name="cmdText">命令文本</param>
/// <param name="parameter">命令参数</param>
/// <returns>返回IDataReader接口</returns>
public static IDataReader ExecuteReader(string cmdText,bool cmdType, params IDbDataParameter[] parameter)
{
try
{
IDbCommand cmd = CreateDbCommand();
CommandType type = CommandType.Text;
if (cmdType)
type = CommandType.StoredProcedure; //存储过程
IDbConnection con = CreateConnection();
PrepareCommand(cmd, con, null, type, cmdText, parameter);
return cmd.ExecuteReader(CommandBehavior.CloseConnection);
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// 查询结果,True为存储,False为文本
/// </summary>
/// <param name="cmdText">查询文本</param>
/// <param name="cmdType">命令类型,True为存储,False为文本</param>
/// <param name="parameter">文本参数</param>
/// <returns>返回DataSet</returns>
public static DataSet GetDataTable(string cmdText,bool cmdType, params IDbDataParameter[] parameter)
{
DataSet ds = new DataSet();
IDbDataAdapter dapader = CarateAderDataAdapter();
dapader.SelectCommand = CreateDbCommand();
if (cmdType)
{
dapader.SelectCommand.CommandType = CommandType.StoredProcedure;
}
dapader.SelectCommand.CommandText = cmdText;
if(parameter!=null)
{
foreach(IDbDataParameter p in parameter)
{
dapader.SelectCommand.Parameters.Add(p);
}
}
dapader.Fill(ds);
return ds;
}
/// <summary>
/// 执行事务 参数Hashtable类型 KEY为事务的文本,VALUE为事务得参数
/// </summary>
/// <param name="SQLStringLis">value</param>
/// <returns></returns>
public static int ExecuteSqlTran(Hashtable SQLStringLis)
{
using (IDbConnection con = CreateConnection())
{
con.Open();//打开连接
using (IDbTransaction trans = con.BeginTransaction(IsolationLevel.ReadCommitted))
{
IDbCommand cmd = CreateDbCommand();
int i = 0;
try
{
//循环
foreach (DictionaryEntry myDE in SQLStringLis)
{
string cmdText = myDE.Key.ToString();
IDbDataParameter[] pams = (IDbDataParameter[])myDE.Value;
PrepareCommand(cmd,con, trans, CommandType.Text, cmdText, pams);
i = cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
}
trans.Commit();//提交事务
return i;
}
catch (DbException ex)
{
trans.Rollback();//出现异常 回滚事务
return 0;
throw ex;
}
}
}
}
用的全部是ado.net 对象中的接口。。采用DbProviderFactory 来更换数据库类型。。 private static DbProviderFactory df = DbProviderFactories.GetFactory(数据库类型:如:System.Data.SqlClient,System.Data.OleDb 等);希望还有什么不足之处 大家提出来。。
public class DbHelper
{
public DbHelper()
{
}
/// 得到web.config里配置项的数据库连接字符串。
private static readonly string ConnectionString= ConfigurationManager.ConnectionStrings["ConnectionString"].ToString();
/// 得到工厂提供器类型
private static readonly string ProviderFactoryString= ConfigurationManager.ConnectionStrings["Provider"].ToString();
private static IDbConnection connection = null;
private static DbProviderFactory df = null;
/// <summary>
/// 创建工厂提供器并且
/// </summary>
private static IDbConnection CreateConnection()
{
df = DbProviderFactories.GetFactory(ProviderFactoryString);
connection = df.CreateConnection();
connection.ConnectionString = ConnectionString;
return connection;
}
/// <summary>
/// 创建命令对象
/// </summary>
/// <returns></returns>
private static IDbCommand CreateDbCommand()
{
IDbConnection con= CreateConnection();//创建工厂提供器并且
IDbCommand cmd = df.CreateCommand();
cmd.Connection = con;
return cmd;
}
/// <summary>
/// 创建Adapter对象
/// </summary>
/// <returns></returns>
private static IDbDataAdapter CarateAderDataAdapter()
{
IDbConnection con = CreateConnection();//创建工厂提供器并且
IDbDataAdapter Adapter = df.CreateDataAdapter();
return Adapter;
}
/// <summary>
/// 准备命令参数
/// </summary>
/// <param name="cmd">IDbCommand 命令对象</param>
/// <param name="con">数据库连接对象</param>
/// <param name="comType">解释命令字符串</param>
/// <param name="comText">命令文本</param>
/// <param name="parameter">数据操作命令参数化</param>
/// <returns></returns>
private static void PrepareCommand(IDbCommand cmd, IDbConnection con, IDbTransaction trans, CommandType comType, string comText, params IDbDataParameter[] parameter)
{
if (con.State != ConnectionState.Open)
con.Open();
cmd.Connection = con;
cmd.CommandType = comType;
cmd.CommandText = comText;
if (trans != null)
cmd.Transaction = trans;
if (parameter != null)
{
foreach (IDbDataParameter p in parameter)
{
// 检查未分配值的输出参数,将其分配以DBNull.Value.
if ((p.Direction == ParameterDirection.InputOutput || p.Direction == ParameterDirection.Input) &&
(p.Value == null))
{
p.Value = DBNull.Value;
}
cmd.Parameters.Add(p);
}
}
}
/// <summary>
/// 执行增删改命令 cmdType参数是否调用存储过程。 为true 调用存储过程,false为sql语句
/// </summary>
/// <param name="cmdType">True为存储,False为文本</param>
/// <param name="comText">命令语句</param>
/// <param name="parameter">命令参数</param>
/// <returns>返回影响行数</returns>
public static int ExecuteNonQuery(string cmdText,bool cmdType, params IDbDataParameter[] parameter)
{
using (IDbConnection con = CreateConnection())
{
IDbCommand cmd = CreateDbCommand();
CommandType type = CommandType.Text;
if (cmdType)
type = CommandType.StoredProcedure; //存储过程
PrepareCommand(cmd, con, null, type, cmdText, parameter);
int i= cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
return i;
}
}
/// <summary>
/// 轻量级查询,返回第一行第一列,失败或异常返回NULL
/// </summary>
/// <param name="cmdText">命令文本</param>
/// <param name="parameter">命令参数化</param>
/// <returns></returns>
public static object ExecuteScalar(string cmdText, params IDbDataParameter[] parameter)
{
using (IDbConnection con = CreateConnection())
{
IDbCommand cmd = CreateDbCommand();
PrepareCommand(cmd, con, null, CommandType.Text, cmdText, parameter);
object val = cmd.ExecuteScalar();
cmd.Parameters.Clear();
return val;
}
}
/// <summary>
/// 执行查询,cmdType参数是否调用存储过程。 为true 调用存储过程,false为sql语句
/// </summary>
/// <param name="cmdText">命令文本</param>
/// <param name="parameter">命令参数</param>
/// <returns>返回IDataReader接口</returns>
public static IDataReader ExecuteReader(string cmdText,bool cmdType, params IDbDataParameter[] parameter)
{
try
{
IDbCommand cmd = CreateDbCommand();
CommandType type = CommandType.Text;
if (cmdType)
type = CommandType.StoredProcedure; //存储过程
IDbConnection con = CreateConnection();
PrepareCommand(cmd, con, null, type, cmdText, parameter);
return cmd.ExecuteReader(CommandBehavior.CloseConnection);
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// 查询结果,True为存储,False为文本
/// </summary>
/// <param name="cmdText">查询文本</param>
/// <param name="cmdType">命令类型,True为存储,False为文本</param>
/// <param name="parameter">文本参数</param>
/// <returns>返回DataSet</returns>
public static DataSet GetDataTable(string cmdText,bool cmdType, params IDbDataParameter[] parameter)
{
DataSet ds = new DataSet();
IDbDataAdapter dapader = CarateAderDataAdapter();
dapader.SelectCommand = CreateDbCommand();
if (cmdType)
{
dapader.SelectCommand.CommandType = CommandType.StoredProcedure;
}
dapader.SelectCommand.CommandText = cmdText;
if(parameter!=null)
{
foreach(IDbDataParameter p in parameter)
{
dapader.SelectCommand.Parameters.Add(p);
}
}
dapader.Fill(ds);
return ds;
}
/// <summary>
/// 执行事务 参数Hashtable类型 KEY为事务的文本,VALUE为事务得参数
/// </summary>
/// <param name="SQLStringLis">value</param>
/// <returns></returns>
public static int ExecuteSqlTran(Hashtable SQLStringLis)
{
using (IDbConnection con = CreateConnection())
{
con.Open();//打开连接
using (IDbTransaction trans = con.BeginTransaction(IsolationLevel.ReadCommitted))
{
IDbCommand cmd = CreateDbCommand();
int i = 0;
try
{
//循环
foreach (DictionaryEntry myDE in SQLStringLis)
{
string cmdText = myDE.Key.ToString();
IDbDataParameter[] pams = (IDbDataParameter[])myDE.Value;
PrepareCommand(cmd,con, trans, CommandType.Text, cmdText, pams);
i = cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
}
trans.Commit();//提交事务
return i;
}
catch (DbException ex)
{
trans.Rollback();//出现异常 回滚事务
return 0;
throw ex;
}
}
}
}
代码很简单我就多说了。老鸟们手下留情

浙公网安备 33010602011771号