tec*_*tle 22 c# sql-server executescalar executenonquery
试图弄清楚它是否最好使用,ExecuteScalar或者ExecuteNonQuery我是否想要返回新插入行的标识列.我已经阅读了这个问题并且我理解那里的差异,但是当我查看几周前我写的一些代码时(虽然从这个网站大量借用)我发现在我使用的插件中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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
这对我需要的东西很好,所以我很想知道
ExecuteNonQuery这里使用,因为它更适合进行插入? 我正在使用Visual Studio 2010,.NET 4.0和SQL Server 2008r2,以防万一.
Die*_*ego 28
正如Aaron所建议的那样,存储过程会使速度更快,因为它可以节省Sql Server编译SQL批处理的工作.但是,你仍然可以采用任何一种方法:ExecuteScalar或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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
编程愉快!
编辑:请注意,我们需要投两次:从对象到decimal,然后到int(感谢techturtle注意到这一点).
| 归档时间: |
|
| 查看次数: |
69586 次 |
| 最近记录: |