Чего мне не хватает? Я не могу понять, почему он добавляет дополнительный ‘.’ System.Data.SqlClient.SQLException: ‘Неправильный синтаксис рядом с ‘76231’. ‘

#c# #sql-server #visual-studio

#c# #sql-сервер #visual-studio

Вопрос:

 private void buttonAdd_Click(object sender, EventArgs e)
{
    String FirstName = textBoxFirstName.Text;
    String LastName = textBoxLastName.Text;
    String PhoneNumber = textBoxPhone.Text;
    String Email = textBoxEmail.Text;
    DateTime Birthday = DateBirthday.Value;
    String Street = textBoxStreet.Text;
    String City = textBoxCity.Text;
    String State = textBoxState.Text;
    String Zipcode = textBoxZipcode.Text;

    if (
        FirstName == "" ||
        LastName == "" ||
        PhoneNumber == "" ||
        Email == ""
        )
    {
        MessageBox.Show("Fields with '*' cannot be null");
    }
    else
    {
        SqlConnection con = new SqlConnection("Data Source=SER\SQLEXPRESS;Initial Catalog=SunshineGrace;Integrated Security=True");
        con.Open();
        SqlCommand cmd = new SqlCommand(@"INSERT INTO Customers
            VALUES('"   FirstName   "', '"   LastName   "', '"   PhoneNumber   "', '"   Email   "', '"   Birthday   "', '"   Street   "', '"   City   "', '"   State   "', '"   Zipcode   "'",con);
        cmd.ExecuteNonQuery();
        con.Close();
        MessageBox.Show("Customer Added!");
    }
}
 

Я пытаюсь создать программу, которая добавляет столбец в мою базу данных SQL, я просто не могу понять, почему я получаю эту ошибку. Я пробовал переформатировать команду insert разными способами и изменить dateime на текстовое поле, и оно по-прежнему выдает одно и то же сообщение об ошибке.

Комментарии:

1. Предупреждение о внедрении SQL — вам не следует объединять ваши операторы SQL — используйте вместо этого параметризованные запросы , чтобы избежать внедрения SQL — проверьте таблицы Little Bobby

2. Согласен с @marc_s по поводу SQL-инъекции. Но также вы забыли закрыть ‘)’ в конце команды

3. @Quercus …. какой OP определил бы намного быстрее и проще с улучшенной удобочитаемостью параметризованных запросов

4. Попробуйте ввести последнее имя в as O'Leary , чтобы увидеть первую проблему, с которой столкнется ваш код, когда он начнет работать..

5. И прекратите ленивую вредную привычку НЕ указывать список столбцов для инструкции INSERT. Не уверен, зачем вам нужна дата рождения (не день) для клиента, поскольку это PII, но дата рождения — это дата, а не дата-время.

Ответ №1:

Вы действительно НИКОГДА НЕ должны писать такой SQL-код! Это оставляет вас широко открытыми для SQL-инъекций — уязвимости № 1. Прекратите делать это ПРЯМО СЕЙЧАС!

Вместо этого используйте правильно параметризованные SQL-запросы, а также приобретите привычку помещать ваши одноразовые объекты (например SqlConnection , и SqlCommand ) в соответствующие using() { .. } блоки кода, чтобы обеспечить надлежащее удаление.

Поэтому ваш код должен быть примерно таким:

 // define your INSERT query and use proper list of columns in the table you're inserting into
string query = @"INSERT INTO Customers(FirstName, LastName, PhoneNumber, Email, Birthday, Street, City, State, Zipcode)
                 VALUES(@FirstName, @LastName, @PhoneNumber, @Email, @Birthday, @Street, @City, @State, @Zipcode);";

// put connection and command objects into using blocks 
using (SqlConnection con = new SqlConnection("Data Source=SER\SQLEXPRESS;Initial Catalog=SunshineGrace;Integrated Security=True"))
using (SqlCommand cmd = new SqlCommand (query, con))
{
    // define parameters, with their most appropriate data type, and set their values
    cmd.Parameters.Add("@FirstName", SqlDbType.VarChar, 100).Value = FirstName;
    cmd.Parameters.Add("@LastName", SqlDbType.VarChar, 100).Value = LastName;
    cmd.Parameters.Add("@PhoneNumber", SqlDbType.VarChar, 50).Value = PhoneNumber;
    cmd.Parameters.Add("@Email", SqlDbType.VarChar, 255).Value = Email;
    cmd.Parameters.Add("@Birthday", SqlDbType.Date).Value = Birthday;
    cmd.Parameters.Add("@Street", SqlDbType.VarChar, 100).Value = Street;
    cmd.Parameters.Add("@City", SqlDbType.VarChar, 100).Value = City;
    cmd.Parameters.Add("@State", SqlDbType.VarChar, 100).Value = State;
    cmd.Parameters.Add("@Zipcode", SqlDbType.VarChar, 20).Value = Zipcode;
    
    con.Open();
    cmd.ExecuteNonQuery();
    con.Close();

    MessageBox.Show("Customer added");
} 
 

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