Вставка double в таблицу с помощью SQL и C#

maximovega

Подскажите, пожалуйста, что делаю не совсем корректно?
В наличии имелся код, создающий таблицу с одним-единственным столбцом
string REGION;
List<string> CODE = new List<string>
...
cmd = new SqlCommand("INSERT INTO [" + REGION + "_RESULT] VALUES ('" + CODE[j] + "')", conn);
Мне хочется добавить соответствующее значение к каждому CODE, и я меняю его следуюшим образом
string REGION;
List<string> CODE = new List<string>
List<double> VAL = new List<double>
...
cmd = new SqlCommand("INSERT INTO [" + REGION + "_RESULT] VALUES ('" + CODE[j] + "', " + VAL[j] + ")", conn);
Ошибка, которую получаю на выходе: Column names or number of supplied values do not match the table definition.
В базе данных нужный столбец нужного типа добавить удалось, но в чем тогда несоответствие?

okis

Во-первых, ты пишешь запросы руками, так делать нежелательно, лучше использовать Entity Framework. Во-вторых, если пишешь запросы, то пиши их с параметрами, как здесь.
Это на будущее, программу ты всё равно пишешь/правишь единоразово.
У тебя region пустой и колонка должна _RESULT называться? Ошибка говорит об этом (нет такой колонки). Также, попробуй воспользоваться отладчиком и посмотреть, какой в итоге у тебя вызывается SQL, вопросов сразу станет меньше.

maximovega

Нет, регион - часть названия таблицы. И до присоединения дополнительного столбца код работал совсем без использования названий столбцов.
Итоговая таблица в зависимости от региона будет иметь название UK_RESULT или FR_RESULT.
Параметр не пустой, просто часть кода, в которой его задаю, я заменила многоточием.

okis

Так какой скл-код в итоге выполнился?

maximovega

Первый, там, где всего один столбец. Второй - мои попытки придать в работающий алгоритм заполнение столбика дополнительных величин.

okis

Ну если внимательно посмотреть, то колонка там у тебя тоже одна, так что ошибка вполне закономерная.

maximovega

   О... А как можно исправить это? То есть придать колонку.
   Немного не понимаю, откуда ясно, что была всего одна? Откуда видно количество колонок? Ведь значения я вставляю через запятую.

okis

Кому чего придать? Ну впиши какое-нибудь название колонки и посмотри, что выйдет :ooo:

zorin29

Вообще не то ты говоришь, , она там имена полей в запросе вообще не указывает.
Автору, сделай вот как:

string request="INSERT INTO [" + REGION + "_RESULT] VALUES ('" + CODE[j] + "')";
Console.WriteLine(request); // или как угодно еще сохрани строку запроса
cmd = new SqlCommand(request, conn);

А потом запости сюда, как заполнена переменная request.

okis

ТС разобралась уже, что надо было писать INSERT INTO tablename (column_name,…) values (…).
Да, было такое дело, отвык выполнять работу отладчика в уме. :o

zorin29

Издеваются над девушкой в этой конторе. , ты хоть потребуй прибавки к зарплате за вредность :)

irusyen

конечно, надо писать в скобках названия колонок. если порядок колонок в таблице строго не совпадает с порядком вставляемых значений.это вам подтвердит еще 1 девушка-программист ;)

Alena_08_11

ЭЭЭ
для каждой пары code, value заново создается sqlCmd? (судя по отрывкам кода).

nos159

трагедия белой эмиграции :)

maximovega

Вновь прошу помощи. Раньше код работал, но сейчас перестал, хотя не менялась ни таблица, ни код. Что тут не так?
cmd = new SqlCommand("INSERT INTO [" + REGION + "_RESULT] (CODE, VAL) VALUES ('" + CODE[j] + "', " + VAL[j] + ")", conn);
Получаю
There are fewer columns in the INSERT statement than values specified in the VALUES clause.

kokoc88

Вновь прошу помощи. Раньше код работал, но сейчас перестал, хотя не менялась ни таблица, ни код. Что тут не так?
Формат числа с запятой. Вообще запросы в SQL лучше писать с ? внутри, а потом проставлять параметры. Вот примерно как это делается, в документацию лень залезать:
.... "INSERT INTO TABLE (CODE, VAL) VALUES(?, ?)" ....
var parameter = cmd.CreateParameter;
parameter.Value = CODE[j];
cmd.Parameters.Add(parameter);
....

maximovega

Поясни, пожалуйта, что за формат, как его правильно дать в таблицу?

kokoc88

Поясни, пожалуйта, что за формат, как его правильно дать в таблицу?
Напиши:
double d = 1111.555;
Console.Out.WriteLine("" + d);
У тебя на компьютере, на котором "не работает" стоит русская локализация, и при сложении строки с double вместо точки ставится запятая. Поэтому запрос в базу не работает. Я тебе написал, как лучше сделать, чтобы везде работало, замени в запросе все числа на ?, и добавь их параметрами.

zorin29

Вероятно, ты столкнулась с легким SQL injection. Представь себе, что значение VAL[j] равно 12.4.
Если программа работает в английской системе, то (12.4).ToString = "12.4"
Если же в русской, то (12.4).ToString = "12,4"
Получается, что во втором случае у тебя как бы три аргумента у VALUES:
INSERT ... VALUES ('xxx',12,4)
Вот на это и жалуется SQL Server: колонок перечислено две, а значений - три.
"правильное" решение этой проблемы - не формировать строку SQL запроса самой, а оформлять параметры SQL-запроса как SqlParameter.

zorin29

P.S. Та же проблема у тебя будет, если строка CODE будет содержать кавычки. Вот что будет, если написать
CODE[j] = "',0); DROP TABLE Clients;"

? :)

hprt

ты бы сразу написал, как :)

cmd = new SqlCommand("INSERT INTO [" + REGION + "_RESULT] VALUES (@param1, ...)", conn);
...
cmd.Parameters.AddWithValue("@param1", value1);

cmd.ExecuteНеПомнюЧто;

hprt

А вообще, не надо ее учить - справляясь с нашей помощью с заданиями она убеждает руководство использовать ее вместо того, чтоб нанять нормального программиста, а ей заниматься своим делом

zorin29

Ну а вдруг ей это нравится? Она пытается расти над собой, учится программировать, так сказать, методом погружения.
И вообще, девушкам-программистам положено помогать и всячески их любить :)

FRider

слушай, тебе тут вроде несколько раз говорили, чтобы ты не сторила запросы путем конкатенации строк. Так писать НЕЛЬЗЯ. Заботай уже именованные/неименованные параметры.

zorin29

Я думаю, там у них все иначе. Есть уже готовый работающий говнокод, который, в силу самой своей сути, плохо поддерживаем и всячески убог. Время от времени он начинает глючить, или к нему появляются новые небольшие требования.
Нанимать программиста начальство не хочет, т.к. очень уж задача маленькая. Вот и ставят задачу: сделай, чтобы работало. Вот она и сидит, колбасит код помаленьку :)
Ни о каком рефакторинге говнокода речи не идет - иначе бы наняли программиста. Надо за 15 минут доработать программу напильником. Насколько этот подход достоин - не мне судить, не зная ситуации. Но отвечать на такие простые вопросы, помогать решать такие простые проблемы - иногда приятно, мозг отдыхает :)

hprt

ага, а потом после N маленьких изменений появляется большая задача, с которой она заведомо не справится. Таки наймут программиста, которому придется кроме того, что задачу делать еще и переписывать много всего. И даже не потому, что ему код скажем не нравится, а потому, что она много чего сделала совсем неправильно/испортила - вспомним первый ее вопрос в разделе про смену типа колонки. Ну подумаешь, данные запорола...
А насчет "может нравится" - если б нравилось, давно бы уже книжку любую прочитала, или хотя бы спросила, что почитать. Ну а ответить на простой вопрос - почему нет. Просто у нее это в тенденцию превращается, и именно поэтому считаю, что это плохо (для нее)

zorin29

ага, а потом после N маленьких изменений появляется большая задача, с которой она заведомо не справится. Таки наймут программиста, которому придется кроме того, что задачу делать еще и переписывать много всего. И даже не потому, что ему код скажем не нравится, а потому, что она много чего сделала совсем неправильно/испортила - вспомним первый ее вопрос в разделе про смену типа колонки. Ну подумаешь, данные запорола...
Полностью согласен. Но это все претензии к начальству, а не к самой .
А насчет "может нравится" - если б нравилось, давно бы уже книжку любую прочитала, или хотя бы спросила, что почитать. Ну а ответить на простой вопрос - почему нет. Просто у нее это в тенденцию превращается, и именно поэтому считаю, что это плохо (для нее)
Верно подмечено, вряд ли ей нравится программировать. Скорее, хочет как можно скорее и как можно меньшей кровью решить задачу и вернуться к чему-то более понятному и интересному.
Однако я не перестану отвечать на вопросы в этом форуме, и, думаю, не я один :)

irusyen

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

hprt

ну, во-первых я не наезжал на нее - наоборот. Она сама писала, что основное ее направление - аналитика. Ну вот пусть ей и занимается, а начальству пусть скажет, что раз есть такие задачи, надо нанять спеца. А если хочет в программирование - кто ж против. Я работал с девушками-программистками, претензий к ним не больше чем к остальным. Но пусть научится, а не лезет делать сама не разобравшись, а потом, что не получилось спрашивать (судя по вопросам, учиться она не пыталась, а так разумеется правильнее делать самому сначала)
Насчет тестовой/не тестовой базы - да разницы нет в принципе. Вопрос в подходе. Ей надо было вытянуть данные в нужном формате, но она вбила себе в голову, что надо поменять тип данных в таблице. Тут у нее не получилось, но легко поверю, что были случаи, когда это получалось - иначе бы не настаивала на подходе.
Насчет других форумов :) Тут к ней относятся более чем доброжелательно :) Возьмем, скажем, sql.ru. Сначала ее бы туда-сюда пинали, ибо она не знает с какими системами работает и тд. Пусть в итоге попала бы в MSSQL - там есть такой модер Glory. Умнейший мужик, кучу полезных статей написал. Но вот он не любит тупые вопросы и думать за автора, что ему нужно, ну и довольно резко отвечает. За попытки натолкнуть людей на путь истинный (чтоб человек разобрался и задал вопрос по существу) его новички просто ненавидят. Не раз встречал темы с обсуждением "что за мудак"
Оставить комментарий
Имя или ник:
Комментарий: