使用SqlCommand和范围

时间:2013-10-17 13:11:23

标签: c# sqlcommand

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

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

VS

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

3 个答案:

答案 0 :(得分:2)

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

我还建议将这些方法移到单独的方法中,甚至将其作为一个方法。

答案 1 :(得分:1)

A的优点:两个单独的命令比对两个语句使用相同的命令稍微有点混乱,您可以在不影响命令1的情况下更改命令2的SQL命令重载 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

答案 2 :(得分:0)

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