C# 从DataTable添加到SQL数据库时忽略某些行

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

我有以下数据要从C#中的DataTable插入SQL。如何检查跟踪id是否已在DB中,而不插入它

|    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)”中?