的ExecuteScalar VS的ExecuteNonQuery返回的标识值时(ExecuteSc

2019-07-18 00:50发布

试图找出如果它是最好用ExecuteScalarExecuteNonQuery如果我想返回一个新插入行的标识列。 我已经阅读了这个问题 ,我理解这些差异存在,但找了一些代码时,我写了几个星期前(同时从该网站大量举债),我发现,在我插入我用ExecuteScalar ,就像这样:

public static int SaveTest(Test newTest)
{
    var conn = DbConnect.Connection();
    const string sqlString = "INSERT INTO dbo.Tests ( Tester , Premise ) " +
                             "               VALUES ( @tester , @premise ) " +
                             "SET @newId = SCOPE_IDENTITY(); ";
    using (conn)
    {
        using (var cmd = new SqlCommand(sqlString, conn))
        {
            cmd.Parameters.AddWithValue("@tester", newTest.tester);
            cmd.Parameters.AddWithValue("@premise", newTest.premise);
            cmd.Parameters.Add("@newId", SqlDbType.Int).Direction = ParameterDirection.Output;

            cmd.CommandType = CommandType.Text;
            conn.Open();
            cmd.ExecuteScalar();

            return (int) cmd.Parameters["@newId"].Value;
        }
    }
}

这工作正常我需要什么,所以我不知道

  1. 我是否应该使用ExecuteNonQuery这里,因为它是“更合适的”做插入?
  2. 将检索标识值是相同的无论哪种方式,因为我使用的是输出参数?
  3. 是否有一个方式或其他相关的任何性能命中?
  4. 是否有一般更好的方式来做到这一点总体?

我使用Visual Studio 2010,.NET 4.0和SQL Server 2008 R2,如果说有什么区别。

Answer 1:

正如亚伦建议,因为它节省了Sql Server的编译你的SQL批处理作业的存储过程将使它更快。 但是,你仍然可以去用两种方法: ExecuteScalarExecuteNonQuery 。 恕我直言,它们之间的性能差异是如此之小,要么方法仅仅是为“合适”。

话虽如此,我没有看到使用的点ExecuteScalar如果你抓住从输出参数的标识值。 在这种情况下,返回的值ExecuteScalar变得无用。

我喜欢,因为它需要较少的代码的方法,使用ExecuteScalar无输出参数:

public static int SaveTest(Test newTest)
{
    var conn = DbConnect.Connection();
    const string sqlString = "INSERT INTO dbo.Tests ( Tester , Premise ) " +
                             "               VALUES ( @tester , @premise ) " +
                             "SELECT SCOPE_IDENTITY()";
    using (conn)
    {
        using (var cmd = new SqlCommand(sqlString, conn))
        {
            cmd.Parameters.AddWithValue("@tester", newTest.tester);
            cmd.Parameters.AddWithValue("@premise", newTest.premise);

            cmd.CommandType = CommandType.Text;
            conn.Open();
            return (int) (decimal) cmd.ExecuteScalar();

        }
    }
}

快乐编程!

编辑 :请注意,我们需要转换两次:从对象到decimal ,再到int (感谢techturtle的注意这一点)。



文章来源: ExecuteScalar vs ExecuteNonQuery when returning an identity value