【问题标题】:Update SQL Server database using a list使用列表更新 SQL Server 数据库
【发布时间】:2018-04-22 04:02:00
【问题描述】:

我正在尝试更新 SQL Server 数据库并有一个座位号字符串列表

string strQuery = ("Update tblTransactionItems set selected = 'T' Where SeatNumber = @SeatNumber");

using (SqlCommand cmd = new SqlCommand(strQuery, con)) {
    con.Open();

    foreach (var item in list) {
       string test = item.ToString();
       test = test.Replace('"', ' ').Trim();

       cmd.Parameters.AddWithValue("@SeatNumber", test);
       cmd.ExecuteNonQuery();
    }
}

它一直说变量@SeatNumber 已被声明并且仅更新列表中的第一项。有什么方法可以解决这个问题?

更新:

我只是将 foreach 循环放在了 using 之外,它就可以工作了。

【问题讨论】:

  • 因为您在构建字符串的 foreach 循环的每个迭代中都添加了 @seatnumber ..

标签: c# tsql dao


【解决方案1】:

您正在尝试创建一个 inlist,但使用了一个相等运算符,说 Where SeatNumber = @SeatNumber",而您应该使用一个 IN 运算符,如

Where SeatNumber IN (@SeatNumber)

同样,这不是正确的方法,您应该将这些 inlist 值填充到 DataTable 并将其作为 DbType.Structured 传递

【讨论】:

    【解决方案2】:

    这是因为您已经将CommandParameter 添加到SqlCommand 并且您再次将其添加到循环中

    string strQuery = ("Update tblTransactionItems set selected = 'T' Where SeatNumber = @SeatNumber");
    con.Open();
    foreach (var item in list) {
      using (SqlCommand cmd = new SqlCommand(strQuery, con)) {
        string test = item.ToString();
        test = test.Replace('"', ' ').Trim();
        cmd.Parameters.AddWithValue("@SeatNumber", test);
        cmd.ExecuteNonQuery();
    
      }
    }
    

    【讨论】:

      【解决方案3】:

      每次都需要启动SqlCommand参数。在您的代码中,您使用 SQLCommand 仅第一次执行查询,它会使用列表中的第一项更新您的表。在下一次迭代期间,由于 sqlcommand 仍然保留最后一个值(查询以更新列表中的上一项),它会引发错误。正确的做法如下:

      try{
          string strQuery = ("Update tblTransactionItems set selected = 'T' Where SeatNumber = @SeatNumber");
          con.Open();
          foreach (var item in list) {
            using (SqlCommand cmd = new SqlCommand(strQuery, con)) {
          string test = item.ToString();
          test = test.Replace('"', ' ').Trim();
          cmd.Parameters.AddWithValue("@SeatNumber", test);
          cmd.ExecuteNonQuery();
      
            }
          }
      }
      finally{ con.Close() }
      

      【讨论】:

        【解决方案4】:

        您可以添加一个更清晰的参数行以使其运行。

        string strQuery = ("Update tblTransactionItems set selected = 'T' Where SeatNumber = @SeatNumber");
        
            using (SqlCommand cmd = new SqlCommand(strQuery, con)) {
            con.Open();
            foreach (var item in list) {
                string test = item.ToString();
                test = test.Replace('"', ' ').Trim();
                cmd.Parameters.AddWithValue("@SeatNumber", test);
                cmd.ExecuteNonQuery();
                cmd.Parameters.Clear();
            }
        

        【讨论】:

          【解决方案5】:

          我只是将 foreach 循环放在了 using 之外,它就可以工作了。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-01-29
            • 2011-02-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多