在插入之前检查 DataGridview 中的值是不是与数据库表/模式兼容
Posted
技术标签:
【中文标题】在插入之前检查 DataGridview 中的值是不是与数据库表/模式兼容【英文标题】:Check if values in DataGridview are compatible with database table/schema BEFORE Inserting在插入之前检查 DataGridview 中的值是否与数据库表/模式兼容 【发布时间】:2020-03-06 06:21:33 【问题描述】:我有一个从 excel 文件中获取值的 DatagridView。在数据网格视图中显示值后,用户可以添加/更改它们,当用户按下保存时,我的代码将表插入到我的数据库中。我用 try catch 包围了我的代码,因此当由于值而出现错误时它会停止,但是当用户更正数据并再次按保存时,已插入的第一行将再次插入到数据库中。我的问题是,我怎样才能编写代码,这样它就不会重复它已经插入的行?先感谢您。我插入的代码在下面。
try
for (int i = 0; i < dataGridView1.Rows.Count - 1; i++)
OleDbCommand cmd = new OleDbCommand(commandText, cnn);
Guid g = Guid.NewGuid();
//veritabanına verileri atıyoruz
cmd.Parameters.AddWithValue("@guidkodu", g);
cmd.Parameters.AddWithValue("@faturatarihi", belgetarihigetir((dataGridView1.Rows[i].Cells[0].Value.ToString()))); //datetime a cast ediliyor
cmd.Parameters.AddWithValue("@faturano", (dataGridView1.Rows[i].Cells[1].Value).ToString());
cmd.Parameters.AddWithValue("@vkntckn", (dataGridView1.Rows[i].Cells[2].Value).ToString());
cmd.Parameters.AddWithValue("@tur", (dataGridView1.Rows[i].Cells[3].Value).ToString());
//kdv değerleri yoksa veritabanına null,varsa değerini atıyoruz
if (string.IsNullOrEmpty((dataGridView1.Rows[i].Cells[4].Value).ToString()))
cmd.Parameters.AddWithValue("@kdv0matrahi", System.DBNull.Value);
else
cmd.Parameters.AddWithValue("@kdv0matrahi", ToNullableFloat((dataGridView1.Rows[i].Cells[4].Value).ToString()));
if (string.IsNullOrEmpty((dataGridView1.Rows[i].Cells[5].Value).ToString()))
cmd.Parameters.AddWithValue("@kdv1matrahi", System.DBNull.Value);
else
cmd.Parameters.AddWithValue("@kdv1matrahi", ToNullableFloat((dataGridView1.Rows[i].Cells[5].Value).ToString()));
if (string.IsNullOrEmpty((dataGridView1.Rows[i].Cells[6].Value).ToString()))
cmd.Parameters.AddWithValue("@kdv1tutar", System.DBNull.Value);
else
cmd.Parameters.AddWithValue("@kdv1tutar", ToNullableFloat((dataGridView1.Rows[i].Cells[6].Value).ToString()));
if (string.IsNullOrEmpty((dataGridView1.Rows[i].Cells[7].Value).ToString()))
cmd.Parameters.AddWithValue("@kdv8matrah", System.DBNull.Value);
else
cmd.Parameters.AddWithValue("@kdv8matrah", ToNullableFloat((dataGridView1.Rows[i].Cells[7].Value).ToString()));
if (string.IsNullOrEmpty((dataGridView1.Rows[i].Cells[8].Value).ToString()))
cmd.Parameters.AddWithValue("@kdv8tutar", System.DBNull.Value);
else
cmd.Parameters.AddWithValue("@kdv8tutar", ToNullableFloat((dataGridView1.Rows[i].Cells[8].Value).ToString()));
if (string.IsNullOrEmpty((dataGridView1.Rows[i].Cells[9].Value).ToString()))
cmd.Parameters.AddWithValue("@kdv18matrah", System.DBNull.Value);
else
cmd.Parameters.AddWithValue("@kdv18matrah", ToNullableFloat((dataGridView1.Rows[i].Cells[9].Value).ToString()));
if (string.IsNullOrEmpty((dataGridView1.Rows[i].Cells[10].Value).ToString()))
cmd.Parameters.AddWithValue("@kdv18tutar", System.DBNull.Value);
else
cmd.Parameters.AddWithValue("@kdv18tutar", ToNullableFloat((dataGridView1.Rows[i].Cells[10].Value).ToString()));
if (string.IsNullOrEmpty((dataGridView1.Rows[i].Cells[11].Value).ToString()))
cmd.Parameters.AddWithValue("@oiv", System.DBNull.Value);
else
cmd.Parameters.AddWithValue("@oiv", ToNullableFloat((dataGridView1.Rows[i].Cells[11].Value).ToString()));
if (string.IsNullOrEmpty((dataGridView1.Rows[i].Cells[12].Value).ToString()))
cmd.Parameters.AddWithValue("@faturatutari", System.DBNull.Value);
else
cmd.Parameters.AddWithValue("@faturatutari", ToNullableFloat((dataGridView1.Rows[i].Cells[12].Value).ToString()));
//cmd.Parameters.AddWithValue("@islemtarihi", zaman);
cmd.ExecuteNonQuery();
MessageBox.Show("Veriler Kaydedildi");
this.Hide();
//GirisFormu a = new GirisFormu();
// a.ShowDialog();
catch (Exception)
MessageBox.Show("bir hata oluştu, tekrar deneyiniz");
【问题讨论】:
您的意思是要在您的表和数据库之间进行检查吗?这样您就不会将重复记录从表中插入到数据库中? @Raynoceros 没错。而且我相信我在插入时会使用 IF NOT EXISTS 语句。 您可以在数据库中设置您的主键,这样当尝试插入重复记录时,它会无法这样做并返回违反主键约束错误 您还可以再次从数据库中读取所有内容并将其存储在另一个表中,通过逐行循环检查所有记录,将 准备插入数据与桌子。 为什么不使用事务来避免对数据库进行任何不必要的插入。当一切顺利时您提交数据,否则回滚事务。看这个帖子:***.com/questions/4352590/… 【参考方案1】:在你的类中声明一个静态变量count并将其初始化为0
static int count=0;
由 *** 突出显示的评论和更改
try
for (int i = count; i < dataGridView1.Rows.Count - 1; i++)//***start the for loop by count***
OleDbCommand cmd = new OleDbCommand(commandText, cnn);
Guid g = Guid.NewGuid();
//veritabanına verileri atıyoruz
cmd.Parameters.AddWithValue("@guidkodu", g);
cmd.Parameters.AddWithValue("@faturatarihi", belgetarihigetir((dataGridView1.Rows[i].Cells[0].Value.ToString()))); //datetime a cast ediliyor
cmd.Parameters.AddWithValue("@faturano", (dataGridView1.Rows[i].Cells[1].Value).ToString());
cmd.Parameters.AddWithValue("@vkntckn", (dataGridView1.Rows[i].Cells[2].Value).ToString());
cmd.Parameters.AddWithValue("@tur", (dataGridView1.Rows[i].Cells[3].Value).ToString());
//kdv değerleri yoksa veritabanına null,varsa değerini atıyoruz
if (string.IsNullOrEmpty((dataGridView1.Rows[i].Cells[4].Value).ToString()))
cmd.Parameters.AddWithValue("@kdv0matrahi", System.DBNull.Value);
else
cmd.Parameters.AddWithValue("@kdv0matrahi", ToNullableFloat((dataGridView1.Rows[i].Cells[4].Value).ToString()));
if (string.IsNullOrEmpty((dataGridView1.Rows[i].Cells[5].Value).ToString()))
cmd.Parameters.AddWithValue("@kdv1matrahi", System.DBNull.Value);
else
cmd.Parameters.AddWithValue("@kdv1matrahi", ToNullableFloat((dataGridView1.Rows[i].Cells[5].Value).ToString()));
if (string.IsNullOrEmpty((dataGridView1.Rows[i].Cells[6].Value).ToString()))
cmd.Parameters.AddWithValue("@kdv1tutar", System.DBNull.Value);
else
cmd.Parameters.AddWithValue("@kdv1tutar", ToNullableFloat((dataGridView1.Rows[i].Cells[6].Value).ToString()));
if (string.IsNullOrEmpty((dataGridView1.Rows[i].Cells[7].Value).ToString()))
cmd.Parameters.AddWithValue("@kdv8matrah", System.DBNull.Value);
else
cmd.Parameters.AddWithValue("@kdv8matrah", ToNullableFloat((dataGridView1.Rows[i].Cells[7].Value).ToString()));
if (string.IsNullOrEmpty((dataGridView1.Rows[i].Cells[8].Value).ToString()))
cmd.Parameters.AddWithValue("@kdv8tutar", System.DBNull.Value);
else
cmd.Parameters.AddWithValue("@kdv8tutar", ToNullableFloat((dataGridView1.Rows[i].Cells[8].Value).ToString()));
if (string.IsNullOrEmpty((dataGridView1.Rows[i].Cells[9].Value).ToString()))
cmd.Parameters.AddWithValue("@kdv18matrah", System.DBNull.Value);
else
cmd.Parameters.AddWithValue("@kdv18matrah", ToNullableFloat((dataGridView1.Rows[i].Cells[9].Value).ToString()));
if (string.IsNullOrEmpty((dataGridView1.Rows[i].Cells[10].Value).ToString()))
cmd.Parameters.AddWithValue("@kdv18tutar", System.DBNull.Value);
else
cmd.Parameters.AddWithValue("@kdv18tutar", ToNullableFloat((dataGridView1.Rows[i].Cells[10].Value).ToString()));
if (string.IsNullOrEmpty((dataGridView1.Rows[i].Cells[11].Value).ToString()))
cmd.Parameters.AddWithValue("@oiv", System.DBNull.Value);
else
cmd.Parameters.AddWithValue("@oiv", ToNullableFloat((dataGridView1.Rows[i].Cells[11].Value).ToString()));
if (string.IsNullOrEmpty((dataGridView1.Rows[i].Cells[12].Value).ToString()))
cmd.Parameters.AddWithValue("@faturatutari", System.DBNull.Value);
else
cmd.Parameters.AddWithValue("@faturatutari", ToNullableFloat((dataGridView1.Rows[i].Cells[12].Value).ToString()));
//cmd.Parameters.AddWithValue("@islemtarihi", zaman);
cmd.ExecuteNonQuery();
count+=1;//***increment the count on every successful insert.***
MessageBox.Show("Veriler Kaydedildi");
this.Hide();
//GirisFormu a = new GirisFormu();
// a.ShowDialog();
catch (Exception)
MessageBox.Show("bir hata oluştu, tekrar deneyiniz");
【讨论】:
以上是关于在插入之前检查 DataGridview 中的值是不是与数据库表/模式兼容的主要内容,如果未能解决你的问题,请参考以下文章
PLSQL: BEFORE INSERT TRIGGER(在允许插入之前检查其他表中的列中的值)
对于使用“DataGridView”的 Windows 窗体应用程序,如何检查数据源中的值并更改单独单元格的颜色?