【问题标题】:Delete and Update Query in one删除和更新查询合二为一
【发布时间】:2014-03-17 22:42:48
【问题描述】:
cmd1.CommandText = "Delete from tblindividualproduct where ProductID = @p1";
cmd1.CommandText = "UPDATE tblproductinformation AS pInfo JOIN tblindividualproduct AS iProduct ON iProduct.Code = pInfo.Code SET pInfo.Quantity = pInfo.Quantity - 1 WHERE iProduct.ProductID = @p1";
cmd1.Connection = conn;
cmd1.Parameters.AddWithValue("@p1", "");
for (int i = 0; i < ids.Length; i++)
   {
      string val = ids[i];
      cmd1.Parameters[0].Value = val;
      cmd1.ExecuteNonQuery();
   }

我已经尝试过这段代码,但我似乎无法让它工作。更新查询是唯一有效的。我想删除一个表上的行并更新另一个表的数量。我该怎么做?

【问题讨论】:

  • 您是否收到错误消息?如果是这样,请将其包含在您的问题中
  • 您设置 CommandText 一次,然后再次设置它,这将替换第一个值。如果您希望 CommandText 包含 BOTH 语句,那么您必须分配一个包含 BOTH 语句的字符串。对于 MySQL,我不确定,但是使用 SqlClient,您可以使用分号分隔多个语句,所以这将是我尝试的第一件事。
  • @wwarren:没有错误,它只是不起作用。
  • @jmcilhinney:我已经尝试过这种方法,但也不起作用。只有一个查询被触发。
  • 你试过在中间加分号吗?

标签: c# mysql sql database


【解决方案1】:

真的不知道为什么要在一个语句中执行 2 个命令。请执行下列操作。肯定会工作:

using (SqlConnection connection = new SqlConnection(connectionString))
{
    connection.Open();
    using (SqlCommand command1 = new SqlCommand(commandText1, connection))
    {
    }

    using (SqlCommand command2 = new SqlCommand(commandText2, connection))
    {
    }
....
}

【讨论】:

    【解决方案2】:

    我错了,还是您尝试在 WHERE 子句中使用您刚刚在第一条语句中删除的 ProductID 进行更新?

    cmd1.CommandText = @"UPDATE tblproductinformation AS pInfo JOIN tblindividualproduct AS iProduct 
                         ON iProduct.Code = pInfo.Code SET pInfo.Quantity = pInfo.Quantity - 1 
                         WHERE iProduct.ProductID = @p1;
                         Delete from tblindividualproduct where ProductID = @p1; 
    

    只需颠倒语句的顺序即可。

    当然,这假设您使用单个 SQL 文本,其中两个命令用分号分隔。在您的问题中,错误只是由最后一个命令(UPDATE)覆盖命令文本引起的,也可以通过两个单独的命令解决,但首先更新,最后删除。

    【讨论】:

    • 我有两个数据库,一个是带有产品ID和产品代码的单个产品,1是只有产品代码但有数量的产品信息。我想删除individualproduct中的产品并调整productinfo中的数量。我使用 2 个代码(pInfo.Code,Iproduct.Code)连接两个数据库,以便它选择产品 ID,然后将数量减去 1。
    • 但是这些是针对同一个连接执行的...?
    • 这里听起来不太对劲。您删除了一个产品,但您只想减少一个数量?如果没有更多产品,逻辑似乎也需要在 productinfo 表中删除。但是,如果您先在产品表中删除,那么您将无法在 productinfo 中找到记录,因为 WHERE 找不到任何产品
    【解决方案3】:

    你能试试这个吗?

    //command text in one block
    string cmdText = @"Delete from tblindividualproduct where ProductID IN ({0})
                                    UPDATE tblproductinformation AS pInfo JOIN tblindividualproduct AS iProduct ON iProduct.Code = pInfo.Code SET pInfo.Quantity = pInfo.Quantity - 1 WHERE iProduct.ProductID IN ({0})";
    
    cmdText = string.Format(cmdText, string.Join(",", ids));
    
    cmd1.CommandText = cmdText;
    cmd1.Connection = conn;            
    cmd1.ExecuteNonQuery();
    

    最好, 丹尼尔

    【讨论】:

    • evanmcdonnal 是对的。更新部分将应用于零行。
    【解决方案4】:

    一旦您将命令设置为删除,您就将值更改为更新命令。

    cmd1.CommandText = "Delete from tblindividualproduct where ProductID = @p1";
    cmd1.CommandText = "UPDATE tblproductinformation AS pInfo JOIN tblindividualproduct AS iProduct ON iProduct.Code = pInfo.Code SET pInfo.Quantity = pInfo.Quantity - 1 WHERE iProduct.ProductID = @p1";
    

    这两行都调用了CommandText 的setter,所以只有第二行实际被执行。除此之外,SQL 永远不会起作用。您的 where 使用相同的键值,您的第一个命令将删除该列,因此更新将应用于零行。

    相反,在你的 for 循环中;

    cmd1.Connection = conn;
    for (int i = 0; i < ids.Length; i++)
       {
          cmd1.CommandText = "Delete from tblindividualproduct where ProductID = @p1";
          cmd1.Parameters[0].Value = ids[i];
          cmd1.ExecuteNonQuery();
    
          cmd1.CommandText = "UPDATE tblproductinformation AS pInfo JOIN tblindividualproduct AS iProduct ON iProduct.Code = pInfo.Code SET pInfo.Quantity = pInfo.Quantity - 1 WHERE iProduct.ProductID = @p1";         
    
          cmd1.ExecuteNonQuery();
       }
    

    我不知道您打算如何决定删除哪些 id 以及更新哪些 id,但是如果您打算对不同的 id 使用不同的查询,那么您需要在 for 循环中设置命令,以便它可以从一个 id 更改为下一个。就像一个随机示例一样,您可以将i+=2 作为循环中的增量条件,然后在更新奇数的同时删除偶数 id。但这并没有真正的意义,更有可能您只需要这两个命令之一。

    编辑:最后一个免责声明,这绝不是最佳做法,也不是故意的。 OP 代码的控制流存在根本问题,我只想解决这些问题。如另一个答案所示,还有其他明显的问题,例如当相关对象实现 IDisposable 时缺少 using 语句,我选择不解决。

    【讨论】:

    • 我有两个数据库,一个是带有产品ID和产品代码的单个产品,1是只有产品代码但有数量的产品信息。我想删除individualproduct中的产品并调整productinfo中的数量。我使用 2 个代码(pInfo.Code,Iproduct.Code)连接两个数据库,以便它选择产品 ID,然后将数量减去 1。
    • @MixAustria 好的,我进行了编辑,我认为它会满足您的需求。它假设两个查询的 id 相同,运行第一个,更新 cmd,然后运行第二个。另一个更好的选择是只创建SqlCommand 的实例,每个查询一个,并在 for 循环中执行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-02
    • 2021-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多