Я получаю сообщение об ошибке «Ошибка преобразования типа данных nvarchar в real».

#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%.