2016-05-04 2 views
0

У меня проблема, хотя я проверил первичный ключ в базе данных. Дополнительная информация:Не удается вставить дубликат ключа в объект

Дополнительная информация: Нарушение ограничения PRIMARY KEY 'PK_Yeucaukhachhang. Невозможно вставить дублирующий ключ в объект 'dbo.Yeucaukhachhang'. Значение дублирующегося ключа (MH01123123).

using (SqlConnection sqlCon = new SqlConnection(sqlCnt)) 
{ 
    for (int i = 0; i < metroGrid2.Rows.Count; i++) 
    { 
     SqlCommand cmd = new SqlCommand("INSERT INTO 
     Yeucaukhachhang(MaKH,MaHang,TenHang,DonViTinh,Dongia, 
     SoLuong,Duyet) values('"+ makh.Text+"','"+ 
     metroGrid2.Rows[i].Cells["mahang"].Value + 
     "','"+metroGrid2.Rows[i].Cells["tenhang"].Value+"', '"+ 
     metroGrid2.Rows[i].Cells["donvitinh"].Value+"', '"+ 
     metroGrid2.Rows[i].Cells["dongia"].Value+"', '"+ 
     metroGrid2.Rows[i].Cells["soluong"].Value+"', 'N')", sqlCon); 
     SqlCommand cmd1 = new SqlCommand("INSERT INTO DanhMucKhachHang(MaKhachHang,TenKhachHang,DiaChiKhachHang,SDTKhachHang,CMD,masothue,thanhtoan,nganhang,taikhoannganhang,ngaythang,MaHang,TenHang,DonViTinh,Dongia,SoLuong,Duyet) VALUES(@MaKhachHang,@TenKhachHang,@DiaChiKhachHang,@SDTKhachHang,@CMD,@masothue,@thanhtoan,@nganhang,@taikhoannganhang,@ngaythang)", sqlCon); 
       cmd1.Parameters.AddWithValue("@MaKhachHang", makh.Text); 
       cmd1.Parameters.AddWithValue("@TenKhachHang", namekh.Text); 
       cmd1.Parameters.AddWithValue("@DiaChiKhachHang", address.Text); 
       cmd1.Parameters.AddWithValue("@SDTKhachHang", phone.Text); 
       cmd1.Parameters.AddWithValue("@CMD", idkh.Text); 
       cmd1.Parameters.AddWithValue("@masothue", idthue.Text); 
       cmd1.Parameters.AddWithValue("@thanhtoan", deliver.Text); 
       cmd1.Parameters.AddWithValue("@nganhang", bank.Text); 
       cmd1.Parameters.AddWithValue("@taikhoannganhang", idacc.Text); 
       cmd1.Parameters.AddWithValue("@ngaythang", this.datekh.Value); 

       sqlCon.Open(); 
       cmd.ExecuteNonQuery(); 
       cmd1.ExecuteNonQuery(); 
       sqlCon.Close(); 
       MessageBox.Show("Thêm thành công, đa chuyển qua xác nhận yêu cầu"); 
       LTQL.Home.Home cort = new LTQL.Home.Home(); 
       cort.Show(); 
       this.Hide(); 
      } 
+0

1. Проверено имя базы данных. 2. Напишите sql delete makh = MH01123123 и повторите попытку. –

+1

Почему вы используете параметризованный запрос для 'cmd1', но не для' cmd'? –

+0

, пожалуйста, напишите свою структуру таблицы для Yeucaukhachhang. – tharif

ответ

1

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

Однако, я могу хотя бы дать вам несколько указателей, пытаясь отследить ошибку.

Во-первых, я бы порекомендовал вам переписать код, чтобы построить свою команду что-то вроде этого:

string szCommand = "INSERT INTO Yeucaukhachhang(MaKH,MaHang,TenHang,DonViTinh,Dongia, 
      SoLuong,Duyet)"; 
szCommand += string.Format("values ('{0}','{1}','{2}','{3}','{4}','{5}')", 
makh.Text, metroGrid2.rows[i].cells["mahang"].Value, 
metroGrid2.Rows[i].Cells["tenhang"].Value, 
metroGrid2.Rows[i].Cells["donvitinh"].Value, 
metroGrid2.Rows[i].Cells["dongia"].Value, 
metroGrid2.Rows[i].Cells["soluong"].Value); 
SqlCommand cmd = new SqlCommand(szCommand,sqlCon); 

В случае, если вы не знакомы с String.Format, что нужно помнить о том, что номера внутри команды { } относятся к параметрам после закрытия «

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

Затем, если вы все еще есть проблемы, просто написать szCommand в текстовый файл где-нибудь:

using (StreamWriter sw = new StreamWriter(@"C:\temp\log.txt", true)) 
{ 
    sw.WriteLine(szCommand); 
    sw.Close(); 
} 

Это покажет вам именно то, что становится передается к объекту команды.

Надеюсь, это поможет.

+0

большое вам спасибо, я буду проверять согласие на вас. –

Смежные вопросы