在插入之前检查 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 c# 中添加列和行

对于使用“DataGridView”的 Windows 窗体应用程序,如何检查数据源中的值并更改单独单元格的颜色?

怎么在datagridview中选中一行怎么写

c#如何获取已检查的datagridview复选框旁边的值?

如何在c#中只打印datagridview中的已检查行