2016-08-22 3 views
0

У меня есть проблемы при попытке вставить значение «DateTimePicker» в колонку типа «дата»Вставить значение даты в SQL базы данных в C#

cmd = new SqlCommand("insert into PIECE_D_IDENDITE VALUES('" + textBox4.Text + "','" + dateTimePicker2.Value + "','" + textBox7.Text + "','" + comboBox1.SelectedValue + "');insert into PERSONNE (ID_CARTE,PRENOM_PERSONNE,NOM_PERSONNE,PROFESSION_PERSONNE,TEL_PERSONNE,ADRESSE_PERSONNE,DATE_NAIS_PERSONNE)values('" + textBox4.Text + "','" + textBox1.Text + "','" + textBox2.Text + "','" + textBox8.Text + "','" + textBox10.Text + "','" + textBox9.Text + "','" + dateTimePicker1.Value + "')", cn); 
       cn.Open(); 
       cmd.ExecuteNonQuery(); 
       MessageBox.Show("success!"); 

Так что проблема, когда я выбираю номер дневного величайшим чем 12 (например, 13/10/2016), появляется эта ошибка => «Ошибка конверсии при преобразовании даты и/или времени из символьной строки».

+3

Использовать параметры ALWAYS – Steve

+6

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

+0

@JonSkeet вы можете дать мне пример использования параметризованного SQl, пожалуйста, в этом случае пожалуйста. Я новичок в C# –

ответ

2

Вы всегда должны использовать параметризованный SQL и не выполнять преобразование в строку, особенно для Date \ DateTimes.

SqlCommand cmd = new SqlCommand(@"insert into PIECE_D_IDENDITE VALUES 
    (@v1, @v2, @v3, @v4); 
insert into PERSONNE 
(ID_CARTE,PRENOM_PERSONNE,NOM_PERSONNE, 
PROFESSION_PERSONNE,TEL_PERSONNE, 
ADRESSE_PERSONNE,DATE_NAIS_PERSONNE) 
values 
(@ID_CARTE,@PRENOM_PERSONNE,@NOM_PERSONNE, 
@PROFESSION_PERSONNE,@TEL_PERSONNE, 
@ADRESSE_PERSONNE,@DATE_NAIS_PERSONNE);", cn); 


cmd.Parameters.AddWithValue("@v1", textBox4.Text); 
cmd.Parameters.AddWithValue("@v2", dateTimePicker2.Value); 
cmd.Parameters.AddWithValue("@v3", textBox7.Text); 
cmd.Parameters.AddWithValue("@v4", comboBox1.SelectedValue); 

cmd.Parameters.AddWithValue("@ID_CARTE", textBox4.Text); 
cmd.Parameters.AddWithValue("@PRENOM_PERSONNE", textBox1.Text); 
cmd.Parameters.AddWithValue("@NOM_PERSONNE", textBox2.Text); 
cmd.Parameters.AddWithValue("@PROFESSION_PERSONNE", textBox8.Text); 
cmd.Parameters.AddWithValue("@TEL_PERSONNE", textBox10.Text); 
cmd.Parameters.AddWithValue("@ADRESSE_PERSONNE", textBox9.Text); 
cmd.Parameters.AddWithValue("@DATE_NAIS_PERSONNE", dateTimePicker1.Value); 

cn.Open(); 
cmd.ExecuteNonQuery(); 
MessageBox.Show("success!"); 

В первой вставке вы не указали названия полей. Это будет работать, но зависит от порядка полей и опасных IMHO (и я предположил, что все поля, отличные от дат, имеют строку типа, если нет, преобразуют их в соответствующие типы).

+0

Он работал как волшебство! Спасибо брат –

-1

Эта проблема связана с локальной конфигурацией даты ваших форм/серверов и возвращаемым значением.

Если локальный формат даты MM/DD/YYY и вы не преобразовываете перед вызовом процедуры, день 13 будет сохранен в формате MM даты в базе данных.

У меня нет никакой информации о конфигурации MySQL или конфигурации Winform, но я уверен, что эти проблемы отличаются от формата даты на клиенте/сервере.