试图弄清楚是否最好使用ExecuteScalar
or ExecuteNonQuery
如果我想返回新插入行的标识列。我读过了这个问题 https://stackoverflow.com/questions/2974154/what-is-the-difference-between-execute-scalar-execute-reader-and-executenonque我理解那里的差异,但是当查看我几周前写的一些代码时(同时大量借用这个网站)我发现在我的插入中我正在使用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;
}
}
}
这很适合我的需要,所以我想知道
- 我是否应该使用
ExecuteNonQuery
在这里是因为它“更适合”进行插入?
- 因为我使用的是输出参数,所以检索标识值是否相同?
- 是否存在与其中一种方式相关的任何性能影响?
- 总的来说,是否有更好的方法来做到这一点?
我使用的是 Visual Studio 2010、.NET 4.0 和 SQL Server 2008r2,以防有什么不同。
正如 Aaron 所建议的,存储过程会使速度更快,因为它节省了 Sql Server 编译 SQL 批处理的工作。但是,您仍然可以采用任一方法:ExecuteScalar
or ExecuteNonQuery
。恕我直言,它们之间的性能差异非常小,任何一种方法都是“正确的”。
话虽如此,我不明白使用的意义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();
}
}
}
快乐编程!
EDIT:请注意,我们需要强制转换两次:从对象到decimal
,然后到int
(感谢 techturtle 注意到这一点)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)