ADO.net架构的优良使得,C#操作多数库访问异常方便,我们可以将驱动写在连接字符串里,
利用 DbProviderFactory 获取驱动的工厂,示例代码如下
/// <summary>
/// 数据库操作帮助类,可处理CRUD 操作,和存储过程调用
/// </summary>
public class Dbutil
{
private DbProviderFactory _factory;
private string _connectionString;
private string _connectioinName;
public string ConnectionName
{
get { return _connectioinName; }
set
{
_connectioinName = value;
_connectionString = ConfigurationManager.ConnectionStrings[value].ConnectionString;
_factory = DbProviderFactories.GetFactory(ConfigurationManager.ConnectionStrings[value].ProviderName);
}
}
public Dbutil(string connName)
{
ConnectionName = connName;
}
public DataSet ExecuteDataSet(string sql, List<DbParameter> list)
{
using (DbConnection conn = _factory.CreateConnection())
using (DbCommand cmd = _factory.CreateCommand())
using (DbDataAdapter da = _factory.CreateDataAdapter())
{
conn.ConnectionString = _connectionString;
cmd.Connection = conn;
cmd.CommandType = CommandType.Text;
cmd.CommandText = sql;
da.SelectCommand = cmd;
foreach (DbParameter i in list)
{
cmd.Parameters.Add(i);
}
using (DataSet ds = new DataSet())
{
conn.Open();
da.Fill(ds);
return ds;
}
}
}
public int ExecuteNonQuery(string sql)
{
using (DbConnection conn = _factory.CreateConnection())
using (DbCommand cmd = _factory.CreateCommand())
{
conn.ConnectionString = _connectionString;
cmd.Connection = conn;
cmd.CommandType = CommandType.Text;
cmd.CommandText = sql;
conn.Open();
return cmd.ExecuteNonQuery();
}
}
public int ExecuteNonQuery(string sql, List<DbParameter> list)
{
using (DbConnection conn = _factory.CreateConnection())
using (DbCommand cmd = _factory.CreateCommand())
{
conn.ConnectionString = _connectionString;
cmd.Connection = conn;
cmd.CommandType = CommandType.Text;
cmd.CommandText = sql;
foreach (DbParameter i in list)
{
cmd.Parameters.Add(i);
}
conn.Open();
return cmd.ExecuteNonQuery();
}
}
public IEnumerable<object> ExecuteProcedure(string procedureName, List<DbParameter> list)
{
using (DbConnection conn = _factory.CreateConnection())
using (DbCommand cmd = _factory.CreateCommand())
{
conn.ConnectionString = _connectionString;
cmd.Connection = conn;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = procedureName;
foreach (DbParameter i in list)
{
cmd.Parameters.Add(i);
}
conn.Open();
var res = cmd.ExecuteNonQuery();
yield return res;
foreach (DbParameter i in list)
{
if (i.Direction == ParameterDirection.Output)
yield return i.Value;
}
}
}
}