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;
}
}
}
Это прекрасно работает для того, что мне нужно, поэтому ямне интересно
Должен ли я использоватьExecuteNonQuery
здесь, потому что этоправильнее делать вставки?Будет ли получение значения идентичности в любом случае, так как яиспользуя выходной параметр?Есть ли какие-либо проблемы производительности, связанные с тем или иным способом?Есть ли вообще лучший способ сделать это в целом?используя Visual Studio 2010, .NET 4.0 и SQL Server 2008r2, на случай, если это что-то изменит.