试图找出是否最好使用ExecuteScalar
或ExecuteNonQuery
如果我想返回新插入行的标识列。我已阅读this question,我理解这些差异存在,但找了一些代码时,我写了几个星期前(同时从该网站大量举债),我发现,在我插入我用ExecuteScalar
,就像这样:返回标识值时ExecuteScalar vs ExecuteNonQuery
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,以防有什么区别。
(1)为什么'ExecuteNonQuery'“更合适”? (2)您是否考虑过使用存储过程?如果不是,为什么不呢?它肯定会帮助你清理所有你放入你的应用程序的临时SQL - 当你必须改变它时,这意味着你必须重新编译和重新部署应用程序。 –
嗯...... ExecuteNonQuery通常用于执行不期望返回结果的SQL。 ExecuteScalar返回一个值,所以你不需要通过参数。你可以改变你的SQL的最后部分为'SELECT SCOPE_IDENTITY();'然后使用'return(int)cmd.ExecuteScalar();' – Sam
我使用'ExecuteScalar'因为我使用'SELECT SCOPE_IDENTITY'没有输出参数,因此检索“ExecuteScalar”的单个值。 http://stackoverflow.com/a/9319609/284240 –