C# c如果记录存在则更新,否则插入新记录

C# c如果记录存在则更新,否则插入新记录,c#,insert,C#,Insert,我有一个代码,当用户在页面的三个框中输入某些值时,它会将数据插入表中 这些箱子是订单号、总重量和跟踪参考 我现在需要向这段代码添加更多功能,首先检查订单号是否存在,如果存在,我需要更新列,如果不存在,我需要插入新行并向其中添加数据 我的想法很简单,比如如果结果=0,插入新的,否则更新 如何修改代码以实现此目的 protected void Page_Load(object sender, EventArgs e) { errorLabel.Visible = false; suc

我有一个代码,当用户在页面的三个框中输入某些值时,它会将数据插入表中

这些箱子是订单号、总重量和跟踪参考

我现在需要向这段代码添加更多功能,首先检查订单号是否存在,如果存在,我需要更新列,如果不存在,我需要插入新行并向其中添加数据

我的想法很简单,比如如果结果=0,插入新的,否则更新

如何修改代码以实现此目的

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");
}
您可以在INSERT语句之前添加一些SELECT查询。因此,如果SELECT查询返回多行,这意味着您在数据库中已经有了该记录,需要更新。所以,一般来说

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();
}
编辑: 或者更短一些:

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();

最有效的方法是将功能放入存储过程,例如伪代码: 如果存在,请从订单中选择*,其中OrderNo=@OrderNo 更新

否则 插入

如果不能创建新的存储过程,也可以创建包含此语句的命令,尽管可读性通常较差。
这两种方法都只需要一个DB请求。

您好,请简要说明。在单击事件中实现数据访问逻辑是一种不好的做法,这会导致紧密耦合,并使您在系统增长时更难维护代码。而是创建负责与数据访问层交互的类。然后你可以有一个类来检查实体是否存在,并执行普通的CRUD操作。所以我也改变了这一点。我认为这比根据你的回答自己给出答案并获得信用要好如果两个操作试图这样做,会不会造成竞争条件?存在竞争条件的可能性,但我认为这超出了这个问题的范围。