【问题标题】:using SqlCommand and scope使用 SqlCommand 和范围
【发布时间】:2013-10-17 13:11:23
【问题描述】:

谁能告诉我是否有充分的理由使用以下两个代码块之一而不是另一个?

using (SqlTransaction mySqlTransaction = mySqlConnection.BeginTransaction)
{
    using (SqlCommand mySqlCmd =
        new SqlCommand("First of many SQL statements here", mySqlConnection, mySqlTransaction)
    {
        mySqlCmd.Parameters.Add("@MyFirstParm", SqlDbType.Int).Value = myFirstVal;
        mySqlCmd.ExecuteNonQuery();
    }

    using (SqlCommand mySqlCmd =
        new SqlCommand("Second of many SQL statements here", mySqlConnection, mySqlTransaction)
    {
        mySqlCmd.Parameters.Add("@MySecondParm", SqlDbType.Int).Value = mySecondVal;
        mySqlCmd.ExecuteNonQuery();
    }

    .
    .
    .

    sqlTransaction.Commit();
}

对比

using (SqlTransaction mySqlTransaction = mySqlConnection.BeginTransaction)
{
    using (SqlCommand mySqlCmd = new SqlCommand("", mySqlConnection, mySqlTransaction)
    {
        mySqlCmd.Parameters.Add("@MyFirstParm", SqlDbType.Int).Value = myFirstVal;
        mySqlCmd.Parameters.Add("@MySecondParm", SqlDbType.Int).Value = mySecondVal;

        mySqlCmd.CommandText = "First of many SQL statements here";
        mySqlCmd.ExecuteNonQuery();

        mySqlCmd.CommandText = "Second of many SQL statements here";
        mySqlCmd.ExecuteNonQuery();

        .
        .
        .
    }

    sqlTransaction.Commit();
}

【问题讨论】:

  • 您的查询有多少个参数?
  • 第二种方法结束时有多少个参数?
  • 正确。参数的数量可能很重要,因为(对不起,如果我错了)您可能会通过提供查询来面对错误消息,即您有太多参数

标签: c# sqlcommand


【解决方案1】:

我会选择 1,因为每个 SqlCommand 都有一组新参数。

我还建议将它们移到单独的方法中,甚至将其作为存储过程。

【讨论】:

  • 更改命令文本会重置参数集合,因此这并不是真正的优势。
【解决方案2】:

A 的优点:两个单独的命令比对两个语句使用相同的命令稍微容易混淆,并且您可以更改命令 2 的 SQLcommand 重载而不影响命令 1 B 的优点:使用更少的资源和更少的代码(如果这对您很重要)

两者的优点:您可以将单个方法包装在 try catch 中,以使两者都必须成功才能提交事务,否则回滚。

两者的缺点:在现代方法中硬编码 SQL 是非常危险的,如果这些参数来自任何 UI 对象中的任何文本字段,那么您的数据库可能会因 SQL 注入攻击而变得混乱。让一个 db 方法执行两个单独的语句比只处理存储过程中的语句更令人困惑。此外,使用存储过程并将您的命令类型更改为 commandtype.storedprocedure 将防止 sql 注入攻击通过参数进入(在大多数情况下)。那里有很多关于 SQL 注入的精彩文章,这里有一篇相关的。

http://blogs.msdn.com/b/raulga/archive/2007/01/04/dynamic-sql-sql-injection.aspx

【讨论】:

    【解决方案3】:

    但是对于您的情况,第三个选项可以是一个存储过程,它需要 2 个参数并在内部执行您的所有语句。在这种情况下,您只需要一条 executeNonQuery 指令。

    【讨论】:

    • 我不喜欢将应用程序逻辑移动到存储过程中,并且只有在您确实需要性能提升时才会亲自这样做。如果您这样做,您还可以将事务移到那里,只留下对存储过程的单个调用。
    • 嗯……您在所呈现的快照中看到了什么样的应用程序逻辑?我只是在这里看到一个顺序命令执行。我会捍卫一种观点,即在存储过程逻辑中没有事务。主体中没有事务的存储过程可以与其他可能涉及事务本身的代码一起按顺序调用。
    猜你喜欢
    • 2023-03-28
    • 2020-10-16
    • 1970-01-01
    • 1970-01-01
    • 2022-10-25
    • 1970-01-01
    • 2019-08-12
    • 2013-02-06
    • 1970-01-01
    相关资源
    最近更新 更多