#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. Это просто хорошая практика — всегда следовать этому.