SqlBulkCopy忽略数据库中数据库的重复记录

时间:2015-07-10 12:22:01

标签: c# asp.net .net

我可以从我传递给SqlBulkCopy的数据表中忽略已存在于sql数据库中的数据的重复记录。如果是,则如何,如果没有和其他选项也解释我。

2 个答案:

答案 0 :(得分:1)

不,那不是内置的。您需要先清理客户端上的数据或首先插入临时表。

答案 1 :(得分:1)

正如之前的海报所说,这不是内置的。我使用以下方法实现了类似的目标:

SQL存储过程,它接受带有您需要的数据的TableValuedParameter。

在存储过程中,我然后将所有记录插入到临时表中。一旦你有了它,就可以在存储过程中使用SQLs MERGE语句来插入尚不存在的数据。

所以,让我们假设我们的数据只是将人们的名字存储在一个表人中。我们只持有一个ID和一个名字。我还假设这张桌子叫做'人'。

以下是我创建表值参数类型(在SQL Server中创建)的方法

CREATE TYPE udt_person AS TABLE(
[id] [INT] NOT NULL,
[name] [nvarchar(50)] NULL
)
GO

我现在创建存储过程:

CREATE PROCEDURE SaveNewPeople @pPeople udt_Person
AS
BEGIN
    -- Create Temp table
    CREATE TABLE #tmpPeople (id INT, name VARCHAR 50)

    -- We will stage all data passed in into temp table
    INSERT INTO #tmpPeople
    SELECT id, name FROM @pPeople

    -- NB: you will need to think about locking strategy a bit here
    MERGE people AS p
    USING #tmpPeople AS t
    ON p.id = t.id
    WHEN NOT MATCHED BY TARGET THEN
        -- We want to insert new person
        INSERT (id, name) VALUES (t.id, t.name)
    WHEN MATCHED THEN
        -- you may not need this, assume updating name for example
        UPDATE SET p.name = t.name

END

现在我们已经安装了SQL。

让我们在C#中创建大量数据:

DataTable ppl = new DataTable();
ppl.Columns.Add("id", typeof(int));
ppl.Columns.Add("name", typeof(string));

// table is created, let's add some people
var bob = ppl.NewRow();
bob["id"] = 1;
bob["name"] = "Bob";
ppl.Rows.Add(bob);

var jim = ppl.NewRow();
jim["id"] = 2;
jim["name"] = "Jim";
ppl.Rows.Add(jim);

// that's enough people for now, let's call the stored procedure
using(var conn = new SqlConnection("YouConnStringHere"))
{
    using(var cmd = new SqlCommand("SaveNewPeople", conn))
    {
        cmd.CommandType = CommandType.StoredProcedure;

        var tvp = new SqlParameter
        {
          ParameterName = "@pPeople",
          SqlDbType = SqlDbType.Structured,
          Value = ppl,
          TypeName = "udt_person"
        }
        cmd.Parameters.Add(tvp);
        conn.Open();
        cmd.ExecuteNonQuery();
    }

}

希望这会给你一个想法。如果您随后修改了C#datatable,则应该看到插入,更新或忽略的行。

祝你好运。