#sql-server
#c# #mysql #sql #sql-обновление
Вопрос:
Код, который у меня есть, приведен ниже, не могли бы вы сообщить мне, в чем может быть проблема, чтобы мы могли снизить цену по идентификатору склада на 7%?
private void button4_Click(object sender, EventArgs e)
{
try
{
myConnection = new SqlConnection(frm.cs);
myCommand = new SqlCommand("update Inventory set Price=@Price where WarehouseCode=6", myConnection);
myConnection.Open();
myCommand.Parameters.AddWithValue("@Price", "@Price * 0.7");
myCommand.ExecuteNonQuery();
myConnection.Close();
MessageBox.Show("Update successfully!");
DisplayData();
if (myConnection.State == ConnectionState.Open)
{
myConnection.Dispose();
}
}
Ответ №1:
Поскольку вы не присваиваете никакого значения @Price
в коде C #, в то время как ваш Warehouse Id
и Discount rate
должны быть назначены конечным пользователем, я рекомендую, чтобы ваш код был таким:
private void button4_Click(object sender, EventArgs e)
{
try
{
var discountRate = 0.07; //could be Convert.ToDouble(textBox1.Text) or something else
var warehouseId = 6; //again, could be Convert.ToInt32(textBox2.Text) or something else
myConnection = new SqlConnection(frm.cs);
myCommand = new SqlCommand("update Inventory set Price=Price*(1-@DiscountRate) "
"where WarehouseCode=@WarehouseId", myConnection);
myConnection.Open();
myCommand.Parameters.AddWithValue("@DiscountRate", discountRate);
myCommand.Parameters.AddWithValue("@WarehouseId", warehouseId);
myCommand.ExecuteNonQuery();
myConnection.Close();
MessageBox.Show("Update successfully!");
DisplayData();
if (myConnection.State == ConnectionState.Open)
{
myConnection.Dispose();
}
}
catch
{
}
}
Я бы также рекомендовал вам еще раз подумать о своем запросе, поскольку он обновит цену всех продуктов с тем же значением, вы можете рассмотреть возможность передачи параметра @ProductId
, и ваш запрос будет
update Inventory set Price=Price*(1-@DiscountRate)
where WarehouseCode=@WarehouseId and ProductCode=@ProductId
уверен, что это было, например.
Комментарии:
1. А что, если складов 2 с двумя разными идентификаторами, например, 6 и 1? Другими словами, цены на все товары на обоих этих складах должны измениться. Вышеуказанное отлично сработало для одного из хранилищ, но второе не сработало даже после добавления второго объявления для WarhouseID1 = 3;
2. Здесь вы можете рассмотреть
WarehouseId IN (6,1)
3. Таким образом, ваш параметр должен быть строкой идентификатора, я не рекомендую это делать, поскольку для этого потребуется синтаксический анализ этой строки
4. Вы можете вызвать запрос дважды или столько, сколько вам нужно, с разными идентификаторами
5. Я вижу, спасибо, что это тоже сработало. Однако, когда мы попытались восстановить разницу в 7%, изменив минус на плюс, это не сработало: myCommand = new SqlCommand(«обновить цену набора инвентаря = Цена Цена * @discountRate » «где код склада В (1,3)», MyConnection); MyConnection . Open(); Есть ли причина для этого?
Ответ №2:
Я не думаю, что вам действительно нужен параметр. Если вы хотите снизить цену на 7%, то вам следует выполнить вычисления непосредственно в запросе. Вам также необходимо исправить арифметику:
update Inventory set Price = Price * 0.93 where WarehouseCode = 6
Или, может быть, вы хотели передать скидку в качестве параметра. Если это так:
update Inventory set Price = Price * (1 - @Discount) where WarehouseCode=6", myConnection
И вы бы передали значение 0.07
в качестве значения параметра @Discount
.
Комментарии:
1. @vivaldi будьте ОЧЕНЬ, ОЧЕНЬ осторожны при выполнении подобных обновлений. если бы ваша первоначальная попытка сработала, вы бы снизили цену на 30%, а не на 7%.