C# 从DataTable添加到SQL数据库时忽略某些行
我有以下数据要从C#中的DataTable插入SQL。如何检查跟踪id是否已在DB中,而不插入它C# 从DataTable添加到SQL数据库时忽略某些行,c#,sql,sql-server,C#,Sql,Sql Server,我有以下数据要从C#中的DataTable插入SQL。如何检查跟踪id是否已在DB中,而不插入它 | id | invoice_no | tracking_id | account_id | | 1 | 1234556 | 1ZRF3844679912330 | 0000RF3123 | | 2 | 1234556 | 1ZRF3844679912331 | 0000
| id | invoice_no | tracking_id | account_id |
| 1 | 1234556 | 1ZRF3844679912330 | 0000RF3123 |
| 2 | 1234556 | 1ZRF3844679912331 | 0000RF3123 |
| 3 | 1234558 | 1ZRF3844679912322 | 0000RF3123 |
| 4 | 1234558 | 1ZRF3844679912333 | 0000RF3123 |
| 5 | 1234556 | 1ZRF3844679912335 | 0000RF3123 |
| 6 | 1234556 | 1ZRF3844679912337 | 0000RF3123 |
| 7 | 1234557 | 1ZRF3844679912338 | 0000RF3123 |
| 8 | 1234557 | 1ZRF3844679912339 | 0000RF3123 |
| 9 | 1234550 | 1ZRF3844679912310 | 0000RF3123 |
| 10 | 1234550 | 1ZRF3844679912311 | 0000RF3123 |
| 11 | 1234551 | 1ZRF3844679912349 | 0000RF3123 |
假设ID为10的记录的跟踪号已经在DB中,如何在插入其他记录时忽略此记录
编辑:将数据插入sql的代码:
public static bool BulkSaveData(Dictionary<string, DataTable> dtEntries, string duplicatesDateFieldName)
{
try
{
using (var scope = new TransactionScope())
{
using (var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["Invoice"].ConnectionString))
{
conn.Open();
//Bulk insert into the temporal tables
foreach (var dtEntry in dtEntries)
{
var dt = dtEntry.Value;
if (dt == null || dt.Rows.Count == 0)
continue;
using (var s = new SqlBulkCopy(conn))
{
s.DestinationTableName = dt.TableName;
s.ColumnMappings.Clear();
foreach (var column in dt.Columns)
s.ColumnMappings.Add(column.ToString(), column.ToString());
s.WriteToServer(dt);
}
}
}
scope.Complete();
return true;
}
}
catch (Exception ex)
{
SqlLogger.Logger.LogException(ex);
}
return false;
publicstaticboolbulksavedata(字典dtEntries,字符串DuplicatesDataFieldName)
{
尝试
{
使用(var scope=new TransactionScope())
{
使用(var conn=new SqlConnection(ConfigurationManager.ConnectionString[“发票”].ConnectionString))
{
conn.Open();
//大容量插入时态表
foreach(dtEntries中的var dtEntry)
{
var dt=dtEntry.Value;
if(dt==null | | dt.Rows.Count==0)
继续;
使用(var s=新SqlBulkCopy(conn))
{
s、 DestinationTableName=dt.TableName;
s、 ColumnMappings.Clear();
foreach(dt.列中的var列)
s、 添加(column.ToString(),column.ToString());
s、 写服务器(dt);
}
}
}
scope.Complete();
返回true;
}
}
捕获(例外情况除外)
{
SqlLogger.Logger.LogException(ex);
}
返回false;
一种解决方案是在跟踪id时创建唯一索引,并在代码循环中捕获错误
CREATE UNIQUE INDEX YOURINDEXNAME ON YOURTABLENAME(tracking_id);
请在此处发布您的代码以及问题陈述。首先尝试筛选数据表。执行更新查询,返回值是更改的行数。如果主键不在数据库中,则更改的行数将为零。因此,您可以执行插入。您可以使用MERGE命令插入新数据并更新旧数据数据能否先获取现有行,然后在select语句中排除这些行,即“不在(x,y,z)”中?