2011-04-07 40 views
5

Estoy procesando los elementos que los usuarios han seleccionado de una vista de cuadrícula y realizando una operación de inserción de correo electrónico y base de datos.Obteniendo la ID del registro recién insertado?

Cuando el usuario selecciona un botón, el código siguiente toma información de la vista de cuadrícula, crea un nuevo pedido en la tabla de pedidos y crea nuevas entradas en la tabla de transacciones.

¿Cómo puedo obtener la última identificación insertada si uso este método para insertar un registro? ¿Recomendarías un enfoque diferente a este simple problema?

protected void btnOrder_Click(object sender, EventArgs e) 
{ 
    double Total = 0; 
    string MailFrom = "[email protected]"; 
    string MailTo = "[email protected]"; 
    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); 
} 

Respuesta

10

uso identidad alcance al final de su consulta de inserción y volverá insertada ID como ...

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

Editar: por su ayuda, aquí es algún artículo que le puede ayudar para implementar

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

+0

Eso es lo que he estado leyendo, pero no estoy seguro de cómo crear directamente mi propia declaración de inserción: S – Kolten

+0

@Kolten; He editado y pegado algunos enlaces por tu ayuda. –

+0

+1 para los enlaces, aunque me gustaría darle más: ^) – Katia

1

Sobre la base de lo que dijo @Muhammad Akhtar, puede devolver la identidad al final de su inserción y luego pasar el escalar de nuevo a su capa/función de llamada DB. Lo he usado mucho como comprobación para ver si el inserto se ha ido bien, devuelve -1 o algo para indicar que ha fallado. A continuación, puede usar esto como una forma de pasarle un mensaje al usuario diciendo que este es el caso.

También estructuraría su código de manera diferente y tendría un objeto Order con OrderItems. Esto se crea desde la vista de cuadrícula y se pasa a su capa de acceso a datos (DAL). El DAL puede hacer las inserciones y devolver el objeto Order y los artículos de pedido subsiguientes actualizados con el ID también si es necesario.

Cuestiones relacionadas