c#将dataGridView1里面的数据插入sql数据库前去重复。
问题描述:
将dataGridView1里面的数据插入sql数据库前去重复,防止主健报错,大概要求就是重复的数据抛出记录,不重复的数据插入,成功的在richTextbox显示成功,重复的在richTextbox显示重复。需要代码。
答
数据规模多大,对处理时间有没有要求
答
这个你应该在服务端用存储过程进行判断,根据它的唯一标识进行判断,若存在就抛出异常,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语句。
循环内把关键信息拼接。循环外去判断重复性。