ExecuteScalarvsExecuteNonQueryWhenReturnIdentityValue如果我想返回一个新插入行的identitycolumn,尝试决定使用ExecuteScalar还是ExecuteNonQuery更好。我已经阅读了这个问题并且我理解那里的区别,但是在查看我几周前写的一些代码时(尽管从该站点大量借用)我发现在我的插入中我使用的是ExecuteScalar如下:publicstaticintSaveTest(TestnewTest){varconn=DbConnect.Connection();conststringsqlString="INSERTINTOdbo.Tests(Tester,Premise)"+"VALUES(@tester,@premise)"+"SET@newId=SCOPE_IDENTITY();";使用(conn){使用(varcmd=newSqlCommand(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();返回(int)cmd.Parameters["@newId"].Value;这对我需要的东西很好用,所以我想知道我是否应该在这里使用ExecuteNonQuery因为它更适合插入?由于我使用的是输出参数,检索到的标识值是否相同?是否有与此相关的性能影响?通常有更好的方法来做到这一点吗?我正在使用VisualStudio2010、.NET4.0和SQLServer2008r2,以防万一。正如Aaron所建议的那样,存储过程会使它更快,因为它节省了SqlServer编译SQL批处理的工作。但是,您仍然有两个选择:ExecuteScalar或ExecuteNonQuery。恕我直言,它们之间的性能差异是如此之小,以至于任何一种方法都是“正确的”。话虽如此,如果您从输出参数中获取标识值,我看不到使用ExecuteScalar的意义。在这种情况下,ExecuteScalar返回的值变得毫无用处。我喜欢的方法,因为它需要更少的代码,使用没有输出参数的ExecuteScalar:publicstaticintSaveTest(TestnewTest){varconn=DbConnect.Connection();conststringsqlString="INSERTINTOdbo.Tests(Tester,Premise)"+"VALUES(@tester,@premise)"+"SELECTSCOPE_IDENTITY()";使用(conn){使用(varcmd=newSqlCommand(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();}}}快乐的编程!编辑:请注意,我们需要转换两次:从对象到十进制,然后到int(感谢techturtle注意到了这一点)。以上就是C#学习教程:ExecuteScalarvsExecuteNonQuery分享了返回标识符值时的所有内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。涉及侵权,请点击维权联系管理员删除。如需转载请注明出处:
