【问题标题】:Import unique records from datatable to sql table将唯一记录从数据表导入到 sql 表
【发布时间】:2011-04-26 20:19:33
【问题描述】:

我有一个与 MS Sql 表结构匹配的数据表,我想将数据表中的新记录导入 SQL。

因此,在下面的示例中,我希望为 Jim 导入记录。

数据表:

Name   DOB        Country
Brian  11-11-78   USA
Dave   01-01-80   UK
Jim    02-02-81   FR

SQL:

Name   DOB        Country
Brian  11-11-78   USA
Dave   01-01-80   UK

【问题讨论】:

  • 你的表的主键是什么?您可以将原始数据库中的所有记录导入到临时表中,然后执行 MERGE (SQL Server)
  • 抱歉我没有PK。我打算结合使用Name和DOB的组合来区分。
  • 还可以查看 Microsoft Sync Framework (msdn.microsoft.com/en-us/sync/default.aspx)

标签: c# sql ado.net datatable dataset


【解决方案1】:

这就是我最终的结果,它似乎可以解决问题。感谢大家的意见。

this.conn = new oleDbConnection(ConfigurationManager.ConnectionStrings["Connection"].ConnectionString);

OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * FROM name", conn);

DataSet ds = new DataSet();

adapter.Fill(ds, "name");

DataTable data = ds.Tables["name"];

sqlCommand = "CREATE TABLE ##TempTable(Name, DOB, Location)";

SqlConnection SQLconn = new SqlConnection(ConfigurationManager.ConnectionStrings["Connection1"].ConnectionString);
SQLconn.Open();

using (SqlCommand cmd = new SqlCommand(sqlCommand, SQLconn))
{
    cmd.CommandType = CommandType.Text;

    cmd.ExecuteReader();

    SqlBulkCopy bulkCopy = new SqlBulkCopy(ConfigurationManager.ConnectionStrings["Connection"].ConnectionString);
    // Map the columns
    foreach (DataColumn col in data.Columns)
    bulkCopy.ColumnMappings.Add(col.ColumnName, col.ColumnName);
    bulkCopy.DestinationTableName = "##TempTable";
    bulkCopy.WriteToServer(data);
}

string MergeCommand = string.Concat("insert into [Existing Table] (Name, DOB, Location) ",
    "select distinct Name, DOB, Location from ##TempTable ",
    "WHERE NOT EXISTS (SELECT 1 FROM [Existing Table] a WHERE a.[Name] = ##TempTable.[Name] and a.[DOB] = ##TempTable.[DOB])");

SqlConnection Mergeconn = new SqlConnection(ConfigurationManager.ConnectionStrings["Connection"].ConnectionString);
Mergeconn.Open();

using (SqlCommand MergeCmd = new SqlCommand(MergeCommand, Mergeconn))
{
    MergeCmd.CommandType = CommandType.Text;
    MergeCmd.ExecuteReader();
}

SQLconn.Close();
Mergeconn.Close();

【讨论】:

    【解决方案2】:
    INSERT INTO
        datatable (name, dob, country)
    SELECT
        name, dob, country
    FROM
        sql
    WHERE
        NOT EXISTS(
            SELECT 
                *
            FROM
                datatable 
            WHERE
                datatable.name=sql.name AND
                datatable.dob=sql.dob
        )
    

    【讨论】:

      【解决方案3】:

      您可以创建一个 SP,并传递您在 DataTable 中的值,然后使用 MERGE (Transact-SQL) 进行 INSERT/UPDATE:

      根据你的数据剪枝,假设你的SQL表名是_DOB

      MERGE INTO _DOB AS Target
      
      USING  (--SELECT NAME,DOB,COUNTRY FROM FROM YOUR DataTable
              VALUES ('Jim','1978-11-11', 'FR')
             )
             AS Source (Name, DOB, Country)
      ON 
          Target.Name = Source.Name
          AND Target.DOB = Source.DOB
      
      WHEN MATCHED THEN
          UPDATE SET 
              Target.Name = Source.Name,
              Target.DOB = Source.DOB,
              Target.Country = Source.Country
      
      WHEN NOT MATCHED BY TARGET THEN
          INSERT (Name, DOB, Country) 
          VALUES (Source.Name, Source.DOB, Source.Country);
      

      【讨论】:

      • 不需要存储过程,只需将数据批量复制到临时表中,然后使用 MERGE 语句(如上所示)更新目标。这应该比单独合并每一行更有效。
      • 根据数据大小和操作频率,它可能是一个选项。
      猜你喜欢
      • 2022-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-16
      • 1970-01-01
      • 1970-01-01
      • 2013-09-09
      • 1970-01-01
      相关资源
      最近更新 更多