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

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, я просто не могу понять, почему я получаю эту ошибку. Я пробовал переформулировать команду вставки разными способами и изменить дату и время на текстовое поле, но все равно выдает одно и то же сообщение об ошибке.

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

Quercus 12.12.2020 10:46

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

Franz Gleichmann 12.12.2020 11:12

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

Caius Jard 12.12.2020 11:28

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

SMor 12.12.2020 13:25
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
5
78
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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. Это просто хорошая практика - всегда.

Другие вопросы по теме