2013-02-10 2 views
0

Я использую эту строку для обновления базы данных, и в этом случае она отлично работает. Он обновляет Znesek_nakupa в в последней строке:C# update database

string sqlUpd = "UPDATE Racun SET Znesek_nakupa='10' WHERE Id_racun= (SELECT MAX(Id_racun) FROM Racun)"; 

Но когда я пытаюсь вставить переменную, а не только 10 он дает мне ошибку:

Error converting data type varchar to numeric.

Пример кода:

double totalPrice = 1.1; 
string sqlUpd = "UPDATE Racun SET Znesek_nakupa='totalPrice' WHERE Id_racun= (SELECT MAX(Id_racun) FROM Racun)"; 

Как я могу это сделать?

ответ

3

Эта проблема меньше связана с SQL и больше связана с использованием строк и переменных в C#.

Чтобы вставить значение переменной в строку в C#, вы не можете просто поместить имя переменной в строку. Строка не «знает», что содержит переменную. Вот несколько подходов, которые будут работать вместо того, чтобы:

double totalPrice = 1.1; 

// string concatenation 
string sqlUpd = 
    "UPDATE Racun SET Znesek_nakupa='" + 
    totalPrice + 
    "' WHERE Id_racun= (SELECT MAX(Id_racun) FROM Racun)"; 

// with string.Format 
string sqlUpd = string.Format(
    "UPDATE Racun SET Znesek_nakupa='{0}' WHERE Id_racun= (SELECT MAX(Id_racun) FROM Racun)", 
    totalPrice); 

Однако подход просто встраивание значение переменной в запросе SQL, как это не считается лучшей практики, как он рискует атаки SQL-инъекции. Обычно вы хотите использовать parameterised SQL queries.

параметризируется версия запроса будет выглядеть следующим образом (подъемного пример со страницы, связанной с выше):

SqlConnection conn = new SqlConnection(_connectionString); 
conn.Open(); 
string s = "UPDATE Racun SET Znesek_nakupa='@totalPrice' WHERE Id_racun= (SELECT MAX(Id_racun) FROM Racun"; 
SqlCommand cmd = new SqlCommand(s); 
cmd.Parameters.Add("@totalPrice", totalPrice); 
SqlDataReader reader = cmd.ExecuteReader(); 
+0

Я уже попробовать оба ваши предложения, но все же ошибка: в этой строке появляется/ ошибка: cmdUpd.ExecuteNonQuery() ;. поэтому, когда я хочу исполнить ... – Clem

+0

Хорошо, я попробовал все, бот все та же ошибка! : / – Clem

0

Хорошо, я получил его. Когда я пытаюсь сохранить переменную totalPrice в базе данных, она приходит к ошибке, потому что у C# есть запятая в качестве разделителя. В базе данных я должен отправить точку вместо этого. Поэтому я просто заменю запятую точкой, и теперь она отлично работает.

Так код будет выглядеть так:

string sqlUpd = "UPDATE Racun SET Znesek_nakupa='" + Convert.ToString(totalPrice).Replace(',', '.') + "' WHERE Id_racun= (SELECT MAX(Id_racun) FROM Racun)";