两段代码相似度90%以上,如何合并减少代码行?

ABC_678 2015-04-28 05:09:38
public static int A(NDBType dbtype, string dbname, DataTable dt, string tabname)
{

switch (dbtype)
{
case NDBType.mysql:
using (MySqlCommand myCom = new MySqlCommand())
{
MySqlConnection myCon = new MySqlConnection(ConfigurationManager.AppSettings[dbname]);
myCon.Open();

MySqlTransaction myTran = myCon.BeginTransaction(IsolationLevel.Serializable);
myCom.Connection = myCon;
myCom.Transaction = myTran;
}
break;

case NDBType.sqlserver:

using (SqlCommand myCom = new SqlCommand())
{
SqlConnection myCon = new SqlConnection(ConfigurationManager.AppSettings[dbname]);
myCon.Open();

SqlTransaction myTran = myCon.BeginTransaction(IsolationLevel.Serializable);
myCom.Connection = myCon;
myCom.Transaction = myTran;
}
break;
}
}
...全文
609 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
比如说你可以写
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语句——就能执行。
  • 打赏
  • 举报
回复
引用 5 楼 xiaohan_678 的回复:
上述写法,循环DT批量生成insert时,参数化无法使用,AddWithValue 该如何改造? for (int i = 0; i < dt.Rows.Count; i++) { foreach (DataColumn col in dt.Columns) { myCom.Parameters.AddWithValue("@" + col.ColumnName + "_" + i.ToString(), dt.Rows[i][col.ColumnName]); } }
这么快就开始用了?呵呵,我还只是想跟你介绍一下而已。 ado.net 的通用框架中肯定没有 sql server 的框架那些扩展。 你可能需要把我上面介绍的“使用“strng-object”键值对给一个命令设置参数”的几行代码自行提取成一个
void AddWithValue(cmd, name,value)
方法才能重复用。
  • 打赏
  • 举报
回复
当然使用 DbTransaction 就是写
using (var conn = SqlHelper.OpenConnection())  //使用上述代码自动创建Conn
using(var trans = conn.BeginTransaction())
{
    //.......
    trans.Commit();
}
总结成一句话:ado.net 本来就是抽象的,不要自己急着发明什么 SQL 抽象方法。
ABC_678 2015-04-28
  • 打赏
  • 举报
回复
上述写法,循环DT批量生成insert时,参数化无法使用,AddWithValue 该如何改造? for (int i = 0; i < dt.Rows.Count; i++) { foreach (DataColumn col in dt.Columns) { myCom.Parameters.AddWithValue("@" + col.ColumnName + "_" + i.ToString(), dt.Rows[i][col.ColumnName]); } }
  • 打赏
  • 举报
回复
以上内容,我是简单地挑一些所谓 SqlHelper 式的“鸡汤级的”代码给你说明 ado.net 是干什么的。这里,没有强调是 sql server还是 mysql 或者 oracle 什么的,ado.net 本来就是一个将这些数据库全都通吃、兼容的框架。 而你学习ado.net时候,可能根据某个入门书的进度从特定的某个数据库开始学起,之后也没有提高过,所以到用的时候才想把那些断章取义的ado.net拼凑起来。 显然当你需要抽象的时候,重新学习这种高一级、更直接的ado.net框架知识更重要。而先不用考虑发明新东西。
  • 打赏
  • 举报
回复
看来你的 ado.net 知识是从“半截”开始构建的。完整的ado.net 是这样的: 一个 DbProviderFactory 通常是这样建立的
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;
            }
        }

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧