获取刚刚插入的记录ID?

Posted

技术标签:

【中文标题】获取刚刚插入的记录ID?【英文标题】:Getting ID of record just inserted? 【发布时间】:2011-07-31 08:59:43 【问题描述】:

我正在处理用户从网格视图中选择的项目,并执行电子邮件和数据库插入操作。

当用户选择一个按钮时,下面的代码会从 gridview 获取信息,在 Order 表中创建一个新订单,并在 Transactions 表中创建新条目。

如果我使用这种插入记录的方法,如何获取最后插入的 ID? 你会推荐一种不同的方法来解决这个简单的问题吗?

protected void btnOrder_Click(object sender, EventArgs e)

    double Total = 0;
    string MailFrom = "webadmin@domain.com";
    string MailTo = "purchasing@domain.com";
    string MailSubject = "Online Order";
    string MailCC = "";
    string MailBCC = "";
    string MailReplyTo = "";
    string MailBody = "";

    TextBox ItmCostCode = (TextBox)form1.FindControl("txtCostCode");

    foreach (GridViewRow gvr in GridView1.Rows)
    
        CheckBox cb = (CheckBox)gvr.FindControl("ItemSelect");
        Label ItmTotal = (Label)gvr.FindControl("ItmTotal");
        Label ItmPrice = (Label)gvr.FindControl("ItmPrice");
        Label ItmName = (Label)gvr.FindControl("lblName");
        TextBox ItmQty = (TextBox)gvr.FindControl("ItmQty");
        TextBox ItmID = (TextBox)gvr.FindControl("lblItemID");

        //Add entry to Order Table
        SqlDataSource2.InsertParameters.Add("OrderDate", DateTime.Now.ToString("MMMM dd, yyyy"));
        SqlDataSource2.InsertParameters.Add("OrderTotal", "0");
        SqlDataSource2.InsertParameters.Add("OrderAccount", "name");
        SqlDataSource2.InsertParameters.Add("OrderCostCentre", ItmCostCode.Text);
        SqlDataSource2.Insert();

        //TODO: GET ORDERID HERE TO USE BELOW:
        if (cb.Checked)
        
            double Price = Convert.ToDouble(ItmPrice.Text);
            double Qty = Convert.ToDouble(ItmQty.Text);

            Total = Price * Qty;
            OrderTotal = OrderTotal + Total;

            MailBody = MailBody + "Item: "+ItmName.Text+" Quantity: "+ItmQty.Text+" Total: "+ItmTotal.Text+"\n\r";

            //Add entry to Transaction Table
            SqlDataSource3.InsertParameters.Add("ItemID", ItmID.Text);
            SqlDataSource3.InsertParameters.Add("OrderID", );
            SqlDataSource3.InsertParameters.Add("Price", ItmPrice.Text);

            SqlDataSource3.Insert();
        

        //TODO: Update Order table with OrderTotal
    

    string strOrderTotal = OrderTotal.ToString();

    MailBody = MailBody+"Order Total: " + strOrderTotal+"\n\r";
    MailBody = MailBody + "Cost Code: " + ItmCostCode.Text;

    MailService.Service1 Mailer = new MailService.Service1();
    Mailer.SendMail("Text", MailFrom, MailTo, MailCC, MailBCC, MailSubject, MailBody, MailReplyTo);

【问题讨论】:

【参考方案1】:

在插入查询末尾使用作用域标识,它会返回插入的 ID,如...

INSERT INTO table (ColumnName) VALUES ();
GO
SELECT SCOPE_IDENTITY();

编辑:为了您的帮助,这里有一些文章可以帮助您实现

http://msdn.microsoft.com/en-us/library/z72eefad.aspx

http://www.mikesdotnetting.com/Article/54/Getting-the-identity-of-the-most-recently-added-record http://www.objectreference.net/post/SCOPE_IDENTITY()-return-the-id-from-the-database-on-insert.aspx

【讨论】:

这就是我一直在阅读的内容,但我不确定如何直接构建自己的插入语句:S +1 链接,虽然我想给你更多:^) 仅供参考,如果您点击第二个链接,他的示例将无法在查询中使用SCOPE_IDENTITY(),而不使用存储过程并将其转换为代码中的int。它不返回整数。您可以使用SELECT CONVERT(int, SCOPE_IDENTITY()) 修复它,而不是将ExecuteScalar 的结果转换为int【参考方案2】:

基于@Muhammad Akhtar 所说,您可以在插入结束时返回标识,然后将标量传回您的数据库调用层/函数。我经常用它来检查插入是否正常,返回 -1 或其他表示它失败的东西。然后,您可以将其用作将消息传回给用户的一种方式,说明情况就是这样。

我还将构建您的代码不同的结构,并有一个带有 OrderItems 的 Order 对象。这从 gridview 创建并传递给您的数据访问层 (DAL)。然后,DAL 可以执行插入操作并返回 Order 对象和后续使用 ID 更新的 OrderItem(如有必要)。

【讨论】:

以上是关于获取刚刚插入的记录ID?的主要内容,如果未能解决你的问题,请参考以下文章

记录mybatis获取刚刚插入到数据库的数据的id

Oracle怎么得到刚刚新插入数据库那条记录的id

插入后获取新记录的ID

如何从此 ADODB.Recordset 中获取插入 ID?

mybatis 批量插入 怎么获取刚刚插入的数据的id集合

MyBatis 插入时返回刚插入记录的主键值