zviek Ответов: 5

Как устранить ошибку


Здравствуйте я работаю над системой генерации расписания и пытаюсь проверить столкновение но это ошибка которую я получаю когда пытаюсь сохранить
Системы.Данных.Sqlclient как.Неправильный синтаксис ситуацию sqlexception: 'рядом с '=''.
любая помощь .

однако ошибки продолжают меняться каждый раз, когда я запускаю их после сборки решения

это еще одна ошибка, появляющаяся
System.Data.SqlClient.SqlException: 'Incorrect syntax near '.4'.'


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

private void btnAdd_Click(object sender, EventArgs e)
       {

           string isClashing = CheckClash();

           if (isClashing == "false")
           {

               SaveTimetable();


           }

           else
           {
               MessageBox.Show("The timeslot chosen is allready occupied!!");
           }

       }
       private string CheckClash()
       {
           Library.conopen();
           string sqlL = "Select LecturerID from Coursese where CourseID = " + cmbCourseID.Text;
           string sqls = "Select ProgramID from Courses where CourseID = " + cmbCourseID.Text;
           string sql = "Select ID from Timetable where Venue = " + cmbVenue.Text + " & ProgramID = " + sqls;

           DataTable dt = new DataTable();

           SqlCommand cmd = new SqlCommand(sql, Library.con);
           SqlDataAdapter DA = new SqlDataAdapter(cmd);
           DA.Fill(dt);

           if (dt.Rows.Count == 0)
           {
               return ("false");
           }
           else
           {
               return ("true");
           }

       }

5 Ответов

Рейтинг:
2

Richard MacCutchan

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


Рейтинг:
1

OriginalGriff

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

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


Рейтинг:
1

danyDude

Ну, во-первых, попробуйте использовать paramters.что-то вроде

string sql = "Select ID from Timetable where Venue = @venue and  ProgramID = @id";


использовать "команду cmd.Параметры.AddWithValue ("@venue", cmbVenue.Text);" или что-то в этом роде, чтобы добавить параметр к команде.

во-вторых, второй/внутренний оператор select в вашем sql должен находиться между скобками ()

Это должно сработать но далеко не идеально со многих точек зрения включая безопасность:
string sql = "Select ID from Timetable where Venue = " + cmbVenue.Text + " and ProgramID = (" + sqls+")";


использовать это слово и не c# и оператор/знак &усилитель;


Рейтинг:
1

Richard Deeming

Здесь нужно исправить несколько вещей:

  • Как уже упоминалось ранее, вам необходимо исправить уязвимости SQL-инъекций в вашем коде;
  • Ваш метод должен вернуться bool не string;
  • Вам не нужно использовать a DataAdapter и DataSet чтобы проверить, существует ли соответствующая запись - просто используйте ExecuteScalar;
  • Вам не нужны два запроса - вам просто нужен ответ. INNER JOIN между двумя столами;
  • Вы должны завернуть SqlCommand в using блок, чтобы убедиться, что он всегда очищен;

private bool CheckClash()
{
    const string Query = "SELECT TOP 1 T.ID FROM Timetable As T INNER JOIN Courses As C ON C.ProgramID = T.ProgramID WHERE T.Venue = @Venue And C.CourseID = @CourseID";
    
    Library.conopen();
    
    using (SqlCommand cmd = new SqlCommand(Query, Library.con))
    {
        cmd.Parameters.AddWithValue("@Venue", cmbVenue.Text);
        cmd.Parameters.AddWithValue("@CourseID", cbmCourseID.Text);
        
        object result = cmd.ExecuteScalar();
        return result != null && !Convert.IsDBNull(result);
    }
}
NB: В зависимости от того, как ваш Library класс реализован, вы, вероятно, захотите снова закрыть соединение, прежде чем этот метод вернется. Было бы проще, если бы класс вернул новый SqlConnection каждый раз, который можно было бы завернуть в using блок.


Рейтинг:
0

Patrice T

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