前进中的蜗牛

番茄大叔

水滴穿石,非一日之功;没有量变,何来质变。

数据库返回新增数据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();

        }
    }
}
posted @ 2017-09-12 11:53  LoveTomato  阅读(518)  评论(0编辑  收藏  举报