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 .... какой OP мог бы обнаружить намного быстрее и проще благодаря улучшенной читабельности параметризованных запросов.
Попробуйте поставить фамилию как O'Leary
, чтобы увидеть первую проблему, с которой столкнется ваш код, когда он будет запущен.
И избавьтесь от ленивой вредной привычки НЕ указывать список столбцов для инструкции INSERT. Не уверен, почему вам нужна дата рождения (не день) для клиента, поскольку это PII, но дата рождения - это дата, а не дата и время.
Вы действительно НИКОГДА, НИКОГДА не должны писать код 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. Это просто хорошая практика - всегда.