c#将dataGridView1里面的数据插入sql数据库前去重复。

c#将dataGridView1里面的数据插入sql数据库前去重复。

问题描述:

将dataGridView1里面的数据插入sql数据库前去重复,防止主健报错,大概要求就是重复的数据抛出记录,不重复的数据插入,成功的在richTextbox显示成功,重复的在richTextbox显示重复。需要代码。

img

数据规模多大,对处理时间有没有要求

这个你应该在服务端用存储过程进行判断,根据它的唯一标识进行判断,若存在就抛出异常,RAISERROR(‘异常’,16,1);否则就新增。在vs判断是有问题的,有一些情况下,你这个代码是不起作用的。

1.建议在程序中,先把dataGridView1中要对比的每一行字段(你这里是:BarCode2_TX)值找出来,放到一个集合(比如:originalList)里;

2.然后再拿这个originalList去数据库查找,把从数据库取出的字段集合(existList)找出来。

3.最后,对比这两个集合的每一项,如果能匹配上,说明数据库中有记录,执行你的替换或者更新操作,否则,说明数据库中没有记录,执行新增操作。

伪代码如下:

private void button1_Click(object sender, EventArgs e)
{
    // DataGridView中第6个列每行的集合(对应你题目中的pr)
    var originalList = dataGridView1.Rows.Cast<DataGridViewRow>()
        .Select(row => (string)row.Cells[5].Value)
        .Distinct();
    
    var existList = GetExistData(originalList);
    // 循环DataGridView中的每一行数据,与数据库中查出来的进行对比
    foreach (var original in originalList)
    {
        var exist = existList.FirstOrDefault(x => x == original);
        if (exist != null)
        {
            // 数据已存在,更新
        }
        else
        {
            // 数据不存在,新增
            // 这里不建议一条一条往数据库写入,建议使用SqlBulkCopy,效率会高很多
        }
    }
}

/// <summary>
/// 根据条件,从数据库查询已存在的集合
/// </summary>
/// <param name="originalList"></param>
/// <returns></returns>
private IEnumerable<string> GetExistData(IEnumerable<string> originalList)
{
    // 这里从数据库按照originalList条件查询
    // SQL语句类似:select BarCode2_TX from Burn_BarCode WHERE BarCode2_TX IN (originalList);
    // 注意:如果数据量太大(百万级),请认真考虑性能问题
    return new List<string>();
}

如果你一次最多五千条数据插入
最好不要再循环里面执行SQL语句。
循环内把关键信息拼接。循环外去判断重复性。