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();
}
我尝试过这段代码,但似乎无法使其正常工作。更新查询是唯一有效的查询。我想删除一个表上的行并更新另一个表的数量。我怎么能这样做?
答案 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。