Member 14165181 Ответов: 3

Справка ошибка C# SQL рядом с '='


textBox11.Text = DateTime.Now.ToShortDateString();

            if (textBox1.Text != "")
            {

                textBox5.Text = label7.Text;

                con.Open();
                string query = "UPDATE Emp2 SET DateOut ='" + textBox11.Text + "' & TimeOut ='" + textBox5.Text + "' WHERE No = '" + textBox1.Text + "'";
                SqlDataAdapter SDA = new SqlDataAdapter(query, con);
                SDA.SelectCommand.ExecuteNonQuery();
                con.Close();
                MessageBox.Show("UPDATE SUCCESS!");
                formload();
            }



An unhandled exception of type 'System.Data.SqlClient.SqlException' occurred in System.Data.dll

Additional information: Incorrect syntax near '='.


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

перепробовал все ничего не работает для меня мне нужна помощь спасибо

Richard Deeming

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

Там также нет необходимости использовать текстовое поле для хранения DateTime.Now - просто передать DateTime.Now к соответствующему параметру запроса.

И проверьте тип данных DateOut чтобы убедиться, что вы не храните даты в виде строк.

3 Ответов

Рейтинг:
1

David_Wimbley

Две вещи

1) ваш SQL уязвим для SQL-инъекций. Простой поиск в google предоставит вам много информации об этом. Учитывая вашу ошибку, вполне возможно, что вы столкнулись с sql-инъекцией в зависимости от того, какие данные вы пытаетесь вставить...например, если я установлю textBox1.Text = "'This' Is'AwfulInput", это также может вызвать эту ошибку.

2)

string query = "UPDATE Emp2 SET DateOut ='" + textBox11.Text + "' & TimeOut ='" + textBox5.Text + "' WHERE No = '" + textBox1.Text + "'";


Взгляните на свой SQL-оператор, у вас есть амперсанд там, где должна быть запятая. Учитывая, что у меня нет доступа к вашему коду или БД, это наиболее вероятное решение.

"UPDATE Emp2 SET DateOut ='" + textBox11.Text + "', TimeOut ='" + textBox5.Text + "' WHERE No = '" + textBox1.Text + "'"


Базовый оператор update должен выглядеть следующим образом: UPDATE TableName SET Column1=", Column2=", где Id = 2. Вы указываете, что пробовали "все", поэтому я бы рекомендовал вам следовать некоторым учебникам sql в вашем путешествии к изучению sql, поскольку операторы UPDATE довольно прямолинейны (это не было задумано как язвительное или грубое, действительно должно было быть полезной рекомендацией).


Рейтинг:
1

MadMyche

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

1. Конкатенированные строки никогда не должны использоваться, это уязвимость SQL-инъекции; она известна уже более 20 лет и неприемлема. Используйте SqlParamaters для добавления значений в объект command.

2. элементы в сет - листе должны быть разделены запятой (,) - не амперсандом (&).

3. SqlDataAdapter предназначен для работы с поиском данных и имеет накладные расходы, которые не нужны для этого приложения. Все, что вам нужно для запуска этого объекта, - это объект SqlCommand.

4. ExecuteNonQuery возвращает Int32, чтобы сообщить вам, сколько строк было затронуто. Это можно использовать для проверки того, что запрос был выполнен должным образом. Я бросил его в твой почтовый ящик.

5. Вы должны использовать блоки try/catch, которые я добавил. В идеале все это должно быть завернуто в using блокируйте, чтобы правильно распорядиться ресурсами.

вдоволь этого... вот переписывание кода, которое я сделал

using (SqlConnection con = new SqlConnection(connectionsting)) {
  try {
    string query = "UPDATE Emp2 SET DateOut = @Dateout, TimeOut = @Timeout WHERE No = @No";
    SqlCommand cmd = new SqlCommand(query, con);
    cmd.Parameters.AddWithValue("@Dateout", textBox11.Text);
    cmd.Parameters.AddWithValue("@Timeout", textBox5.Text);
    cmd.Parameters.AddWithValue("@No", textBox1.Text);

    con.Open();
    int RowsAffected = cmd.ExecuteNonQuery();
    con.Close();

    MessageBox.Show(string.Format("UPDATE SUCCESS! {0} rows were updated". RowsAffected));
  }
  catch (Exception ex) { 
    // your error handling code
  }
}


Рейтинг:
0

Nirav Prabtani

Вам не нужно использовать & оператор в запросе обновления, просто замените его на ,

Обновите свой SQL-запрос, как показано ниже.

string query = "UPDATE Emp2 SET DateOut ='" + textBox11.Text + "', TimeOut ='" + textBox5.Text + "' WHERE No = '" + textBox1.Text + "'";


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