2014-01-03 6 views
0

У меня есть столбец количества запасов в базе данных, а его тип данных - varchar. Когда работники вынимают продукт из магазина, количество инвентаря следует вычесть. У меня возникла какая-то проблема при написании заявления Sql:Выполнить вычисление для столбца данных типа varchar

public bool updateInventoryQty(string productID, int prodQty) 
    { 
     bool result = false; 
     result = Conversion.intToBool(FoodBankDB.executeNonQuery(
      "UPDATE dbo.products SET inventoryQuantity = inventoryQuantity - prodQty WHERE id = '" + productID + "'" 
      )); 

     return result; 
    } 

Принимаю в сумме выведенную как параметр. Поскольку resourceQuantity является varchar, поэтому я думаю, что он не смог выполнить никаких вычислений. Поэтому я должен изменить его на:

"UPDATE dbo.products SET Convert(INT, inventoryQuantity) = inventoryQuantity - prodQty WHERE id = '" + productID + "'" 

Я делаю правильный путь? Заранее спасибо.

+2

использование параметризованных запросов –

+0

[Плохие привычки пинать: выбор неправильного типа данных] (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/12/bad-habits-to-kick-using- the-wrong-data-type.aspx) - вы всегда должны использовать наиболее подходящий тип данных - вот для чего они нужны, в конце концов! И «количество» по определению является ** числовым ** значением - поэтому оно должно храниться как таковое - определенно ** NOT ** как 'varchar'! –

ответ

1

Вы должны быть преобразования в другую сторону задания:

"UPDATE dbo.products 
SET inventoryQuantity = CAST((CAST(inventoryQuantity AS INT) - prodQty) AS VARCHAR(20)) WHERE id = '" + productID + "'" 

Кроме того, не конкатенировать ваши запросы, параметры использования. Теперь вы уязвимы для SQL-инъекций.

+0

My prodQty - переменная. Когда я запустил его, он покажет мне сообщение об ошибке «Недопустимое имя столбца prodQty». –

+0

Так вы не должны использовать '@ prodQty'? – Szymon

+0

Спасибо, это исправлено –

Смежные вопросы