数据库返回新增数据ID
遇到问题
在开发中避免不了遇到这样的问题:需要操作刚插入的数据,怎样解决呢?开始的菜鸟可能查询下最新型插入的,
其实没必要sql server中有个函数SCOPE_IDENTITY()
可以返回新插入的主键。
解决方案一
通过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.ExecuteNonQuery();
return (int) cmd.Parameters["@newId"].Value;
}
}
}
更简单的解决方案二
使用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();
}
}
}