Msgstr "Входная строка была в неправильном формате." вызов int.Parse для оператора SQL - PullRequest
0 голосов
/ 28 марта 2012

Я получаю сообщение об ошибке:

"Введена неверная строка ввода."

Примечание: Если я изменяю строку182 к действительному числу в кавычках (т. Е. «3» или «875») и закомментируйте строку 171, , этот код прекрасно работает .Однако «{7}» в строке 174 - это поле, которое должно автоматически увеличиваться, но не будет.Поэтому я пытаюсь получить «число» в строке 171, которое будет использовать число строк, + 1, для автоинкремента.

Есть ли кто-нибудь на этом?:-)

171   string rowCount = string.Format("SELECT COUNT(*) FROM Log WHERE Location is NULL");

173   string sql = string.Format("insert into Log values " +
174         "('{0}','{1}',{2},{3},'{4}',#{5}#,'{6}','{7}')",
175         comboBox1.Text,
176         comboBox2.Text,
177         float.Parse(textBox1.Text),
178         float.Parse(comboBox3.Text),
179         textBox3.Text,
180         textBox2.Text,
181         addRemove,
182         int.Parse(rowCount) 
183         );

Ответы [ 5 ]

15 голосов
/ 28 марта 2012

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

Далее, подумайте о том, что вы на самом деле получили в rowCount.Это не строка, представляющая целое число - это какой-то SQL.Попытка разобрать, что с int.Parse не сработает, не так ли?Сначала вам нужно выполнить запрос - или использовать подзапрос внутри оператора вставки.Честно говоря, если бы означало как автоинкрементное поле, я бы просто сконцентрировался на том, чтобы заставить это работать, а не искажал его с помощью кода, который будет уязвим для условий гонки.

2 голосов
/ 28 марта 2012

string.Format не собирается выполнять ваши команды SQL.Так что int.Parse точно видит "SELECT COUNT(*) FROM Log WHERE Location is NULL", что, конечно, не является десятичным представлением числа.

2 голосов
/ 28 марта 2012

int.Parse(rowCount) преобразует строку в число, например, "100500" в 100500. Но ваша строка содержит "SELECT COUNT(*) FROM Log WHERE Location is NULL", и это не число.

0 голосов
/ 28 марта 2012

Вы, вероятно, ищете ответ, который исправит ваши проблемы с этой конкретной публикацией. Ответы, которые были опубликованы, помогут вам сделать это.
Вы должны изучить другие подходы. Используйте объект команды и используйте параметры (предложено @JonSkeet)
Проведите исследование о том, как работают столбцы с автоинкрементом. Это зависит от поставщика базы данных. Похоже, что вы можете использовать Microsoft Access. Для MS Sql Server столбец автоинкремента представляет собой столбец идентификаторов, а в Oracle механизм немного отличается, используя последовательности. По сути, вы не предоставляете значения для столбцов с автоинкрементом, вы позволяете ядру базы данных обрабатывать это для вас. (также упоминается предыдущим постером)
Я бы также посоветовал вам присвоить значения ваших текстовых полей переменным и выполнить некоторую проверку данных, прежде чем вставлять их в операторы вставки или параметры. Попробуйте программировать в обороне.

0 голосов
/ 28 марта 2012

Практически все базы данных имеют встроенную поддержку автоинкрементных столбцов.Вы не должны пытаться использовать столбец int и увеличивать его самостоятельно.Существуют всевозможные условия гонки, проблемы с производительностью и т. Д., Чтобы сделать наращивающий столбец действительно надежным, и разработчики баз данных уже позаботились обо всем этом для вас.

...