Member 13904037 Ответов: 3

Как исправить синтаксическую ошибку в первой строке?


У меня есть синтаксическая ошибка MySQL в 1. Линия.

Для этого изменяются сервер и имя пользователя.

Вот этот код
private void button2_Click(object sender, EventArgs e)
{
  string constring = "datasource = 123.456.789 ;port = 3306;username = xxx;password = xxx";
  string query = "INSERT  INTO mysqlcshap.Leitstelle(Auftragsnummer,Objekt,Etage/Station,Straße,HNR) VALUES('" + textBox1.Text + "','" + textBox2.Text + "','" + textBox3.Text + "','" + textBox4.Text + "','" + textBox5.Text + "');";

  MySqlConnection Dateneingabe =new MySqlConnection(constring);
  MySqlCommand cmd = new MySqlCommand(query, Dateneingabe);
  MySqlDataReader myReader;

  try
  {
    Dateneingabe.Open();
    myReader = cmd.ExecuteReader();
    MessageBox.Show("Einsatz angelegt!");

    while (myReader.Read()) { }
  }
  catch (Exception ex)
  { 
    MessageBox.Show(ex.Message); 
  }
}


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

Я пытался изменить его с сервера на источник данных.

Kornfeld Eliyahu Peter

Эта строка: string constring = "datasource = 123.456.789 ;port = 3306;username = xxx;password = xxx"; ?
В нем нет синтаксической ошибки? Вы можете использовать другое значение, содержащее специальный символ, например обратную косую черту, кавычку или двойную кавычку?

F-ES Sitecore

Это означает строку 1 вашего SQL, а не строку 1 кода. Посмотрите на sql, который вы выполняете (фактический SQL, использующий отладчик, а не код), и посмотрите, сможете ли вы обнаружить проблему. Это могут быть имена столбцов, есть ли у вас на самом деле имя столбца под названием "Etage/Station"? Попробуйте заключить имена столбцов в квадратные скобки

NSERT в mysqlcshap.Leitstelle([Auftragsnummer],[объект],[й этаж/станция],[Улица],[ХНР])

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

Использование параметризованных запросов устранит дальнейшие потенциальные проблемы, а также защитит вас от атак SQL-инъекций.

3 Ответов

Рейтинг:
8

Patrice T

string query = "INSERT  INTO mysqlcshap.Leitstelle(Auftragsnummer,Objekt,Etage/Station,Straße,HNR) VALUES('" + textBox1.Text + "','" + textBox2.Text + "','" + textBox3.Text + "','" + textBox4.Text + "','" + textBox5.Text + "');";

Не решение вашего вопроса, а еще одна проблема, которая у вас есть.
Никогда не создавайте SQL-запрос путем объединения строк. Рано или поздно вы сделаете это с помощью пользовательских вводов, и это откроет дверь к уязвимости под названием "SQL-инъекция", она опасна для вашей базы данных и подвержена ошибкам.
Одна кавычка в имени - и ваша программа выйдет из строя. Если пользователь вводит имя, например "Брайан О'Коннер", может привести к сбою вашего приложения, это уязвимость SQL-инъекции, и сбой-это наименьшая из проблем, вредоносный пользовательский ввод, и он продвигается к командам SQL со всеми учетными данными.
SQL-инъекция - Википедия[^]
SQL-инъекция[^]
Атаки SQL-инъекций на примере[^]
PHP: SQL-инъекция - руководство пользователя[^]
Шпаргалка по предотвращению инъекций SQL - OWASP[^]


Рейтинг:
21

OriginalGriff

Синтаксической ошибки в C# нет, но она не выглядит как допустимая строка подключения: С mysql :: mysql в соединителе/сети руководство разработчика :: 5.1.1 создать строку подключения соединителя/сети [^]
Я бы посоветовал вам посмотреть, где вы это взяли, и посмотреть, есть ли пример workign где-то еще.

[редактировать]
И не делай этого так!
Никогда не объединяйте строки для построения команды 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;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

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


Рейтинг:
14

Jochen Arndt

У вас есть имя поля, содержащее символ косой черты. Затем имя поля должно быть заключено в кавычки. Видеть MySQL :: MySQL 8.0 Справочное Руководство :: 9.2 Имена Объектов Схемы[^]:

Цитата:
Разрешенные символы в идентификаторах без кавычек:

ASCII: [0-9,a-z,A-Z$_] (основные латинские буквы, цифры 0-9, доллар, подчеркивание)

Расширенный: U+0080 .. U+FFFF
Избегайте таких символов для имен полей и таблиц. Поэтому я предлагаю изменить имя поля, если это возможно.