Prateek gsharma Ответов: 1

Получение ошибки так как входная строка была не в правильном формате


это мой код.

при вводе числового значения в текстовое поле 5 = 7.5/8.25/6.5 я получаю ошибку, так как входная строка была не в правильном формате.

hrsval инт = инт.Синтаксический анализ(textBox5.Текст);
строковая команда = "вставить в Spldetails([Date],[EmpId],[EmpName],[Designation],[Records],[Splwrkhrs],[Team],[Splwrk],[Splwrkdetails],[Allottedby]) Значения('" + this.dateTimePicker1.Текст + "','" + это.текстовое поле textbox1.Текст + "','" + это.поле textbox2.Текст + "','" + это.textbox3 и.Текст + "','" + Преобразование.ToInt32(this.textBox4.Text) + "','" + hrsval + "', '" + this.textBox8.Text + "', '" +this.comboBox2.Text+"',' " + this.textBox6.Text + "', '" + this.comboBox1.Text + "')";

Что я уже пробовал:

hrsval инт = инт.Синтаксический анализ(textBox5.Текст);
строковая команда = "вставить в Spldetails([Date],[EmpId],[EmpName],[Designation],[Records],[Splwrkhrs],[Team],[Splwrk],[Splwrkdetails],[Allottedby]) Значения('" + this.dateTimePicker1.Текст + "','" + это.текстовое поле textbox1.Текст + "','" + это.поле textbox2.Текст + "','" + это.textbox3 и.Текст + "','" + Преобразование.ToInt32(this.textBox4.Text) + "','" + hrsval + "', '" + this.textBox8.Text + "', '" +this.comboBox2.Text+"',' " + this.textBox6.Text + "', '" + this.comboBox1.Text + "')";

Bryian Tan

Код пытается преобразовать "7.5/8.25/6.5-в int? Боюсь, что это не сработает.
1. не вижу, как эту строку можно перевести в целое число
2. 7.5-это десятичное, а не целое число (целое число)

Karthik_Mahalingam

что означает это значение
7.5/8.25/6.5

1 Ответов

Рейтинг:
10

OriginalGriff

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

int hrsval;
if (!int.TryParse(textBox5.Text, out hrsval))
   {
   MessageBox("Please enter a integer number between 0 and 99");
   return;
   }

Во-вторых, вы не можете разобрать значение типа 7.5 как целое число: это значение с плавающей запятой, поэтому вам нужно разобрать его и сохранить в виде float или double:
double hrsval;
if (!double.TryParse(textBox5.Text, out hrsval))
   {
   MessageBox("Please enter a integer number between 0.0 and 99.99");
   return;
   }

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

Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:
SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку в том, что касается SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x';DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?

Кстати: сделайте себе одолжение и перестаньте использовать имена Visual Studio по умолчанию для всего - вы можете помнить, что "TextBox8" - это номер мобильного телефона сегодня, но когда вам придется изменить его через три недели, вы это сделаете? Используйте описательные имена - например, "tbMobileNo" - и ваш код станет легче читать, более самодокументируемым, более легким в обслуживании - и на удивление быстрее кодировать, потому что Intellisense может добраться до "tbMobile" за три нажатия клавиш, где "TextBox8" занимает размышление и 8 нажатий клавиш...


Prateek gsharma

Спасибо, сэр, хорошо, конечно ... я буду использовать описательные имена.