Получение SQLException при отладке - PullRequest
0 голосов
/ 20 сентября 2011

У меня ошибка, которую я не могу понять.Когда я отлаживаю и пытаюсь запустить оператор вставки, возникает следующее исключение:

"В операторе INSERT меньше столбцов, чем значений, указанных в предложении VALUES. Количество значений впредложение VALUES должно соответствовать количеству столбцов, указанному в операторе INSERT. "

Я просмотрел весь код и не смог найти ошибку, которую допустил.

Это запрос и окружающий код:

SqlConnection myCon = DBcon.getInstance().conn();
int id = gm.GetID("SELECT ListID from Indkøbsliste");
id++;

Console.WriteLine("LNr: " + listnr);
string streg = GetStregkode(navne);
Console.WriteLine("stregk :" + strege);
string navn = GetVareNavn(strege);
Console.WriteLine("navn :" + navne);

myCon.Open();
string query = "INSERT INTO Indkøbsliste (ListID, ListeNr, Stregkode, Navn, Antal, Pris) Values(" + id + "," + listnr + ", '" + strege + "','" + navn + "'," + il.Antal + ", "+il.Pris+")";
Console.WriteLine(il.Antal+" Antal");
Console.WriteLine(il.Pris+" Pris");
Console.WriteLine(id + " ID");
SqlCommand com = new SqlCommand(query, myCon);
com.ExecuteNonQuery();
com.Dispose();
myCon.Close();

Ответы [ 3 ]

1 голос
/ 20 сентября 2011

Прежде всего проверьте строку подключения и подтвердите местоположение базы данных и количество столбцов в таблице.

Предложение. Не используйте жестко закодированную строку SQL.Используйте параметризованные операторы SQL или сохраненный процесс.

Попробуйте параметризованный способ,

string query = "INSERT INTO Indkøbsliste (ListID, ListeNr, Stregkode, Navn, Antal, Pris)   
         Values (@ListID, @ListeNr, @Stregkode, @Navn, @Antal, @Pris)"

SqlCommand com = new SqlCommand(query, myCon);
com.Parameters.Add("@ListID",System.Data.SqlDbType.Int).Value=id;
com.Parameters.Add("@ListeNr",System.Data.SqlDbType.Int).Value=listnr;
com.Parameters.Add("@Stregkode",System.Data.SqlDbType.VarChar).Value=strege ;
com.Parameters.Add("@Navn",System.Data.SqlDbType.VarChar).Value=navn ;
com.Parameters.Add("@Antal",System.Data.SqlDbType.Int).Value=il.Antal;
com.Parameters.Add("@Pris",System.Data.SqlDbType.Int).Value=il.Pris;

com.ExecuteNonQuery();
1 голос
/ 20 сентября 2011

Пожалуйста, всегда используйте параметризованные запросы . Это помогает при таких ошибках, как та, что у вас есть, и, что гораздо важнее, защищает от SQL-инъекций (например, Google термин или отметьте эту запись в блоге).

Например, каковы фактические значения strege и / или navn. В зависимости от этого он может сделать ваш оператор SQL синтаксически неверным или сделать что-то еще хуже.

Вначале это выглядит немного больше, но в конце окупится.

0 голосов
/ 20 сентября 2011

Вы используете настройки датской культуры?

В этом случае, если il.Pris представляет собой двойное или десятичное число, оно будет напечатано через запятую, что означает, что у вашего sql будет дополнительная запятая.

Т.е.:

INSERT INTO Indkøbsliste (ListID, ListeNr, Stregkode, Navn, Antal, Pris) Values(33,5566, 'stegkode','somename',4, 99,44)

, где 99,44 - цена.

Решение состоит в том, чтобы использовать параметры вместо использования значений непосредственно в вашем sql. Посмотрите некоторые другие ответы, уже объясняющие это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...