刚插入记录的ID是如何获取?

5

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

当用户选择按钮时,以下代码会获取来自网格视图的信息,在“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);
}
2个回答

10

这就是我一直在阅读的内容,但我不确定如何直接构建自己的插入语句:S - Kolten
+1 链接,虽然我想给你更多 :^) - Katia
如果你按照第二个链接的示例操作,不使用存储过程并在代码中将其转换为int类型时,在查询中使用SCOPE_IDENTITY()是无效的。它不会返回一个整数。你可以通过使用SELECT CONVERT(int, SCOPE_IDENTITY())来修复它,然后将ExecuteScalar的结果转换为int类型。 - Dan

1
建立在@Muhammad Akhtar所说的基础上,你可以在插入结束时返回标识,然后将该标量传回到你的数据库调用层/函数。我经常使用它来检查插入是否已经成功,返回-1或其他东西来表示失败。然后您可以使用此方法向用户传递消息,说明情况如此。
我还建议您以不同的方式构造代码,并使用一个具有订单商品的订单对象。这个对象是从网格视图中创建的,并传递给数据访问层(DAL)。DAL然后可以执行插入并返回订单对象,如果需要,也可以更新相应的订单商品ID。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接