删除和更新查询合二为一

时间:2014-03-17 22:42:48

标签: c# mysql sql database

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

我尝试过这段代码,但似乎无法使其正常工作。更新查询是唯一有效的查询。我想删除一个表上的行并更新另一个表的数量。我怎么能这样做?

4 个答案:

答案 0 :(得分:1)

不知道你为什么要在一个声明中尝试做2个命令。请执行下列操作。肯定会有效:

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

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

答案 1 :(得分:0)

你可以试试这个吗?

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

最佳, 丹尼尔

答案 2 :(得分:0)

只要将命令设置为delete,就将值更改为update命令。

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永远不会工作。您在哪里使用相同的键值,您的第一个命令将删除该列,以便更新将应用于零行。

相反,在你的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更改为下一个id。就像一个随机的例子,你可以在循环中做i+=2作为增量条件,然后在更新奇数时删除偶数id。但这并不是很有意义,更有可能你只想要两个命令中的一个。

编辑:最后一个免责声明,这绝不是最佳做法,而且并非如此。 OP代码的控制流程存在根本问题,我只打算解决这些问题。如另一个答案所示,还有其他明显的问题,例如当有问题的对象实现IDisposable而我选择不解决时,缺少使用语句。

答案 3 :(得分:0)

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

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)覆盖命令文本引起的,并且也可以通过两个单独的命令解决,但首先是UPDATE,最后是DELETE。