Получение ID записи только что вставлено? - PullRequest
5 голосов
/ 07 апреля 2011

Я обрабатываю элементы, выбранные пользователями из таблицы, и выполняю операцию вставки электронной почты и базы данных.

Когда пользователь выбирает кнопку, приведенный ниже код берет информацию из gridview, создает новый порядок в таблице Order и создает новые записи в таблице транзакций.

Как я могу получить последний вставленный идентификатор, если я использую этот метод вставки записи? Вы бы порекомендовали другой подход к этой простой проблеме?

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 голосов
/ 07 апреля 2011

используйте идентификатор области в конце вашего запроса вставки, и он вернет вставленный идентификатор как ...

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

1 голос
/ 07 апреля 2011

Опираясь на то, что сказал @Muhammad Akhtar, вы можете вернуть идентификатор в конце вашей вставки, а затем передать скаляр обратно в вашу базу данных, вызывающую слой / функцию. Я часто использовал его в качестве проверки, чтобы убедиться, что вставка прошла нормально, верните -1 или что-то еще, чтобы показать, что это сбой. Затем вы можете использовать это как способ передачи сообщения обратно пользователю, говоря, что это так.

Я бы также структурировал ваш код иначе и имел бы объект Order с OrderItems. Он создается из сетки и передается на уровень доступа к данным (DAL). Затем DAL может выполнить вставки и вернуть объект Order и последующие элементы OrderItems, обновленные также с помощью идентификатора, если это необходимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...