Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将唯一记录从datatable导入sql表_C#_Sql_Ado.net_Datatable_Dataset - Fatal编程技术网

C# 将唯一记录从datatable导入sql表

C# 将唯一记录从datatable导入sql表,c#,sql,ado.net,datatable,dataset,C#,Sql,Ado.net,Datatable,Dataset,我有一个与MS Sql表结构相匹配的datatable,我想将新记录从datatable导入Sql 因此,在下面的示例中,我希望为Jim导入记录 数据表: Name DOB Country Brian 11-11-78 USA Dave 01-01-80 UK Jim 02-02-81 FR Name DOB Country Brian 11-11-78 USA Dave 01-01-80 UK SQL: Name

我有一个与MS Sql表结构相匹配的datatable,我想将新记录从datatable导入Sql

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

数据表:

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

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

您可以创建SP,并传递数据表中的值,并用于执行插入/更新:

根据数据进行修剪,假设SQL表的名称为
\u 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);

这就是我的结局,它似乎起到了作用。谢谢大家的意见

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();

表上的主键是什么?您可以将原始数据库中的所有记录导入临时表,然后执行合并(SQL Server)。对不起,我没有PK。我计划结合使用Name和DOB来区分。另外,看看Microsoft Sync Framework()不需要存储过程,只需将数据大容量复制到临时表中,然后使用MERGE语句(如上所示)来更新目标。这应该比单独合并每一行更有效。根据数据大小和操作频率,这可能是一种选择。