SQL多个UPDATE语句问题

时间:2014-02-05 14:48:46

标签: c# sql-server sql-update sqldatareader

我正在使用数据读取器,连接和SqlCommand作为静态变量...在我的第一个子过程中,我有一个带有LIKE子句的select语句,该子句根据用户输入进行搜索匹配记录......第二个子程序通过再次调用datareader循环记录。

此代码用于第三个子程序,该程序应根据用户是否更改当前保存以前加载的记录的任何文本字段来更新2个表。

如果我更改第一个表(第一个中间名或姓氏)并点击“保存”按钮,那么它可以正常工作,但是我在加载任何地址字段时遇到问题。

如何在一个子程序中拥有多个数据读取器/更新语句?从逻辑上讲,代码对我来说很有意义,但也许我看起来不对。

protected void btnSave_Click(object sender, EventArgs e)
{
    var conn = new System.Data.SqlClient.SqlConnection(@"Server=LOCALHOST;Database=AdventureWorks2012;Trusted_Connection=True;");

    try
    {
        conn.Open();
    }
    catch (Exception ex)
    {
        lblSearch.Text = "Connection Error! " + ex;
    }

    var cmd1 = new System.Data.SqlClient.SqlCommand("UPDATE Person.Person SET FirstName=@First, MiddleName=@Middle, LastName=@Last WHERE FirstName=@First", conn);
    var cmd2 = new System.Data.SqlClient.SqlCommand("UPDATE Person.Address SET AddressLine1=@Add1, AddressLine2=@Add2, City=@City, PostalCode=@Zip WHERE AddressLine1=@Add1", conn);
    cmd1.Parameters.AddWithValue("@First", txtFirst.Text);
    cmd1.Parameters.AddWithValue("@Middle", txtMiddle.Text);
    cmd1.Parameters.AddWithValue("@Last", txtLast.Text);
    cmd2.Parameters.AddWithValue("@Add1", txtAddress1.Text);
    cmd2.Parameters.AddWithValue("@Add2", txtAddress2.Text);
    cmd2.Parameters.AddWithValue("@City", txtCity.Text);
    cmd2.Parameters.AddWithValue("@Zip", txtZip.Text);

    try
    {
        dReader1 = cmd1.ExecuteReader();
    }
    catch(Exception ex)
    {
        lblSearch.Text = "Error: " + ex;
    }

    try 
    {
        dReader2 = cmd2.ExecuteReader();
    }
    catch (Exception ex)
    {
        lblSearch.Text = "Error: " + ex;
    }

    try
    {
        dReader1.Read();
    }
    catch (Exception ex)
    {
        lblSearch.Text = "Error: " + ex;
    }

    try
    {
        dReader2.Read();
    }
    catch (Exception ex)
    {
          lblSearch.Text = "Error: " + ex;
    }
}

1 个答案:

答案 0 :(得分:1)

2件事:

  1. 请勿使用datareader更新数据。使用ExecuteNonQuery。
  2. 使用Try..Catch块,代码总是在块之后返回,所以如果说你的连接有错误,它会设置标签但是继续下面的代码,试图运行你的命令。
  3. 否则,您的代码应该可以正常工作,如此处所示。只是不要使用数据加载器。