【问题标题】:Trying to get SELECT SCOPE_IDENTITY() as c# variable试图将 SELECT SCOPE_IDENTITY() 作为 c# 变量
【发布时间】:2016-08-23 22:46:43
【问题描述】:

我在一个表中插入一行,然后想要获取该新 ID,以便可以将其添加到另一个变量中,其中存储了电子邮件地址。

 var db = Database.Open("myDB");
 var insertCommand1 = "INSERT INTO myDB (FirstName, LastName) Values(@0, @1)";                       
 db.Execute(insertCommand1, first, last);
 var lastInsertedId = db.QueryValue("SELECT SCOPE_IDENTITY()");

 var insertCommand2 = "INSERT INTO email (id_person, email) Values(@0, @1)";
 db.Execute(insertCommand2, lastInsertId, email);

其中 id_person 是在我的第一个表中创建的 id。当我运行代码时,我得到 lastInsertedId = {}。为什么它没有为我的第一个表获取主键 int 的 id_person 值而不是 null 的值? --蒂姆

【问题讨论】:

  • 什么是DatabaseExecuteQueryValue 是什么意思?您无法获得正确的值,因为您的语句在不同的范围内执行。
  • 而不是 SCOPE_IDENTITY() 尝试 output inserted.Id(或任何您的 person 表上的 Id 列的名称)。

标签: c# asp.net sql-server asp.net-webpages


【解决方案1】:

来自the documentation of SCOPE_IDENTITY(),强调我的:

返回插入到同一范围内的标识列中的最后一个标识值。范围是一个模块:存储过程、触发器、函数或批处理。 因此,如果两条语句在同一个存储过程、函数或批处理中,则它们属于同一范围

因为您使用两个查询,所以它们被视为两个批次。您需要在单个查询中进行插入和选择。

我不知道您使用的是什么库,所以我只是在猜测语法,但我相信您需要类似的东西

 var db = Database.Open("myDB");
 var insertCommand1 = "INSERT INTO myDB (FirstName, LastName) Values(@0, @1); " +
                      "SELECT SCOPE_IDENTITY()";
 var lastInsertedId = db.QueryValue(insertCommand1, first, last);

 var insertCommand2 = "INSERT INTO email (id_person, email) Values(@0, @1)";
 db.Execute(insertCommand2, lastInsertId, email);

【讨论】:

  • 谢谢斯科特。清楚地解释了为什么它不起作用,并且在将 Select scope_identity 添加到第一个查询后它工作正常。我现在可以与其他人一起跟踪该查询以发布到我的各种其他表,将我的“lastInsertedId”添加为其他表中的外键。 --蒂姆
【解决方案2】:

如果数据库在 SQL SERVER 中,则创建一个 SQL 参数并将方向设置为 “输出”。 请检查此链接:

Getting the identity of the most recently added record

【讨论】:

    【解决方案3】:

    从 SQL Server 取回 SCOPE_IDENTITY() 值非常容易。我将举一个例子,我可以在 c# 标签中打印 SCOPE_IDENTITY() 数据。

    • 从数据插入提交中的我的代码片段
    btnSubmit_Click()
    {
        Random s = new Random();
    
        cmd = new SqlCommand("INSERT INTO [dbo].[tblMemberAccount] ([Userid], [User_pwd], [User_mobile], [User_referal], [UserWallet]) VALUES(@Userid, @User_pwd, @User_mobile, @User_referal, @UserWallet) ​select scope_identity()", cons); 
    
        cmd.CommandType = CommandType.Text;
        cmd.Parameters.AddWithValue("@Userid",s.Next(4506,9999));
        cmd.Parameters.AddWithValue("@User_pwd",txtPassword.Text);
        cmd.Parameters.AddWithValue("@User_mobile",txtPhoneNumber.Text);
        cmd.Parameters.AddWithValue("@User_referal",txtReferral.Text);
        cmd.Parameters.AddWithValue("@UserWallet",10);
        cons.Open();
        int g = Convert.ToInt32(cmd.ExecuteScalar());
        cons.Close();
        lblConfirm.Text = "Member " +g+ " added successfully!";
    }
    

    这里的值 'g' 返回 scope_identity 值。

    【讨论】:

      猜你喜欢
      • 2021-11-15
      • 1970-01-01
      • 1970-01-01
      • 2012-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-09
      相关资源
      最近更新 更多