使用 SqlCommand 和作用域

本文关键字:作用域 SqlCommand 使用 | 更新日期: 2023-09-27 18:35:43

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

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();
}

使用 SqlCommand 和作用域

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

我还建议将它们移动到单独的方法中,甚至将其作为 sproc 进行。

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

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

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

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

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