111,098
社区成员




public static void SetParameter(this DbCommand cmd, string name, object value)
{
var p = cmd.CreateParameter();
p.ParameterName = name;
p.Value = value;
cmd.Parameters.Add(p);
}
我这里知识介绍,只算是抛砖引玉式的。
真正地去设计你自己的通用的SQLHelper,需要你自己去另外设计。例如 sql 命令根据不同数据库的方言,存在不同的资源文件中,然后在你的SQLHelper中只要给个命令名称——而不需要sql语句——就能执行。void AddWithValue(cmd, name,value)
方法才能重复用。using (var conn = SqlHelper.OpenConnection()) //使用上述代码自动创建Conn
using(var trans = conn.BeginTransaction())
{
//.......
trans.Commit();
}
总结成一句话:ado.net 本来就是抽象的,不要自己急着发明什么 SQL 抽象方法。var config = ConfigurationManager.ConnectionStrings["数据库类型"];
Factory = DbProviderFactories.GetFactory(config.ProviderName);
而创建一个数据逻辑连接,采用这样的代码var conn = DbFactory.CreateConnection();
conn.ConnectionString = 数据库连接串;
conn.Open();
要从一个sql语句而产生DBCommand对象,通常可以这样写var cmd = conn.CreateCommand();
cmd.CommandText = sql;
cmd.CommandType = System.Data.CommandType.Text;
而要使用“strng-object”键值对给一个命令设置参数,可以写为类似这样的形式var p = cmd.CreateParameter();
p.ParameterName = name;
p.Value = value;
cmd.Parameters.Add(p);
而如果要从 cmd中查询出一堆数据实体(假设自定义类形 DataType),应该写List<DataType> result = (from IDataRecord rd in cmd.ExecuteReader()
select new DataType
{
Name = (string)rd["Name"],
Cost = (decimal)rd["Cost"]
}).ToList();
当然单纯执行 cmd 就是写 cmd..ExecuteNonQuery();
static void CommCommand<T1, T2>(string dbName)
where T1 : IDbCommand, new()
where T2 : DbConnection, new()
{
using (IDbCommand myCom = new T1())
{
DbConnection myCon = new T2();
myCon.ConnectionString = ConfigurationManager.AppSettings[dbName];
myCon.Open();
DbTransaction myTran = myCon.BeginTransaction(IsolationLevel.Serializable);
myCom.Connection = myCon;
myCom.Transaction = myTran;
}
}
调整下
static void CommCommand<T>(DbConnection myCon)
where T : IDbCommand, new()
{
using (IDbCommand myCom = new T())
{
myCon.Open();
DbTransaction myTran = myCon.BeginTransaction(IsolationLevel.Serializable);
myCom.Connection = myCon;
myCom.Transaction = myTran;
}
}