c# actualización si el registro existe otra cosa insertar nuevo registro

Tengo el código que inserta datos en una tabla cuando un usuario entra en ciertos valores dentro de los tres cuadros de la página.

Las cajas de cartón son el número de orden, el peso total y el seguimiento de la referencia.

Ahora necesito agregar más funcionalidad a este código y comprobar para ver si el número de orden que existe, si no me necesita para actualizar las columnas, si no me necesita para insertar una nueva fila y agregar datos a que.

Yo estaba pensando simplemente, algo así como SI el resultado = 0, Insertar NUEVOS, los DEMÁS actualización

¿Cómo puedo modificar mi código para hacer esto?

protected void Page_Load(object sender, EventArgs e)
{
    errorLabel.Visible = false;
    successLabel.Visible = false;
    errorPanel.Visible = false;
}

protected void submitBtn_Click(object sender, EventArgs e)
{
    if (Page.IsValid)
    {
        int _orderID = Convert.ToInt32(orderID.Text);
        string _trackingID = trackingNumber.Text;
        DateTime _date = DateTime.UtcNow;
        int _weightID = Convert.ToInt32(weightID.Text);

        SqlConnection myConnection = new SqlConnection("Data Source=localhost\\Sqlexpress;Initial Catalog=databasename;User ID=username;Password=password");
        SqlCommand myCommand = new SqlCommand("INSERT into Shipment (TrackingNumber, OrderId, ShippedDateUtc, CreatedOnUtc, TotalWeight) VALUES (@tracking, @order, @date, @date, @weight)", myConnection);

        try
        {
            myConnection.Open();
            myCommand.Parameters.AddWithValue("@order", _orderID);
            myCommand.Parameters.AddWithValue("@tracking", _trackingID);
            myCommand.Parameters.AddWithValue("@date", _date);
            myCommand.Parameters.AddWithValue("@weight", _weightID);
            int rowsUpdated = myCommand.ExecuteNonQuery();
            myConnection.Close();
            if (rowsUpdated > 0)
            {
                alertdiv.Attributes.Add("class", "alert alert-success form-signin");
                successLabel.Text = "Thank you, tracking details have been updated";
                successLabel.Visible = true;
                errorPanel.Visible = true;

            }
            else
            {

                alertdiv.Attributes.Add("class", "alert alert-error form-signin");
                errorLabel.Text = "Oh dear, the order number is not recognised, please check and try again";
                errorLabel.Visible = true;
                errorPanel.Visible = true;
            }

            orderID.Text = "";
            trackingNumber.Text = "";
            weightID.Text = "";
        }
        catch (Exception f)
        {
            errorLabel.Text = "This order number does not exist, please check";
            errorLabel.Visible = true;
            errorPanel.Visible = true;
            return;

        }
    }
}

protected void Signout_Click(object sender, EventArgs e)
{
    FormsAuthentication.SignOut();
    Response.Redirect("Login.aspx");
}
  • Hola, sólo una nota rápida. Es una mala práctica para implementar la lógica de acceso a datos dentro de sus eventos de clic, esto está causando estrecho acoplamiento y hará que sea más difícil para usted para mantener el código a medida que el sistema crece. En lugar de crear clases que tendrá la responsabilidad de interactuar con la capa de acceso a datos. Entonces usted puede tener la clase que puede comprobar si la entidad existe y hacer su normal de operaciones CRUD.
InformationsquelleAutor drac | 2013-10-25

2 Kommentare

  1. 8

    Usted puede agregar un poco de SELECT consulta antes de su INSERT declaración. Así que si el SELECT consulta devuelve más de una fila, significa que ya tiene registro en la DB, y la necesidad de actualización. Así que, en general será como

    SqlCommand cmdCount = new SqlCommand("SELECT count(*) from Shipment WHERE OrderId = @order", myConnection);
    cmdCount.Parameters.AddWithValue("@order", _orderID);
    int count = (int)cmdCount.ExecuteScalar();
    
    if (count > 0)
    {
         //UPDATE STATEMENT
         SqlCommand updCommand = new SqlCommand("UPDATE Shipment SET TrackingNumber = @tracking, ShippedDateUtc = @date, TotalWeight = @weight", myConnection);
         updCommand.Parameters.AddWithValue("@order", _orderID);
         updCommand.Parameters.AddWithValue("@tracking", _trackingID);
         updCommand.Parameters.AddWithValue("@date", _date);
         updCommand.Parameters.AddWithValue("@weight", _weightID);
         int rowsUpdated = myCommand.ExecuteNonQuery();
    }
    else
    {
         //INSERT STATEMENT
         SqlCommand insCommand = new SqlCommand("INSERT into Shipment (TrackingNumber, OrderId, ShippedDateUtc, CreatedOnUtc, TotalWeight) VALUES (@tracking, @order, @date, @date, @weight)", myConnection);
         insCommand.Parameters.AddWithValue("@order", _orderID);
         insCommand.Parameters.AddWithValue("@tracking", _trackingID);
         insCommand.Parameters.AddWithValue("@date", _date);
         insCommand.Parameters.AddWithValue("@weight", _weightID);
         int rowsUpdated = myCommand.ExecuteNonQuery();
    }

    Edición:
    O mucho más corto:

    SqlCommand command;
    
    if (count > 0)
    {
         command = new SqlCommand("UPDATE Shipment SET TrackingNumber = @tracking, ShippedDateUtc = @date, TotalWeight = @weight WHERE OrderId = @order", myConnection);
    }
    else
    {
         command = new SqlCommand("INSERT into Shipment (TrackingNumber, OrderId, ShippedDateUtc, CreatedOnUtc, TotalWeight) VALUES (@tracking, @order, @date, @date, @weight)", myConnection);
    }
    
    command.Parameters.AddWithValue("@order", _orderID);
    command.Parameters.AddWithValue("@tracking", _trackingID);
    command.Parameters.AddWithValue("@date", _date);
    command.Parameters.AddWithValue("@weight", _weightID);
    int rowsUpdated = command.ExecuteNonQuery();
    • He acortado el código pero me di cuenta de que no puso una cláusula where en la consulta. Así que he cambiado que así.
    • Pensé que sería mejor que dar una respuesta a mí mismo basado en el tuyo y obtención de crédito para ello. 🙂
    • Sería de esta forma se crea una condición de carrera si dos de la operación intentado?
    • Hay posibilidad de condición de carrera, pero creo que está fuera del alcance de esta pregunta.
  2. 3

    La manera más eficiente, sería poner la funcionalidad en un Procedimiento Almacenado, por ejemplo (pseudo-código):
    IF EXISTS(SELECT * FROM Orders WHERE OrderNo = @orderNo)
    UPDATE ...

    ELSE
    INSERT ...

    Si usted no puede crear un nuevo procedimiento almacenado, también puede crear un comando que contiene esta Afirmación, aunque la legibilidad suele ser peor.

    Ambos enfoques requieren sólo un DB-solicitud.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea