Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.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# SqlBulkCopy忽略数据库中Datatable的重复记录_C#_Asp.net_.net - Fatal编程技术网

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

C# SqlBulkCopy忽略数据库中Datatable的重复记录,c#,asp.net,.net,C#,Asp.net,.net,我是否可以忽略已存在于sql数据库中的数据的重复记录,这些重复记录来自我正在传递给SqlBulkCopy的datatable。如果是,则说明如何,如果否,还说明我的其他选项。否,这不是内置的。您需要先清理客户机上的数据或将其插入暂存表。如前一张海报所述,这不是内置的。我通过以下方法实现了类似的目标: 接受包含所需数据的TableValuedParameter的SQL存储过程 在存储过程中,我将所有记录插入临时表。一旦有了它,就可以在存储的过程中使用SQLs MERGE语句在数据不存在的地方插入数

我是否可以忽略已存在于sql数据库中的数据的重复记录,这些重复记录来自我正在传递给SqlBulkCopy的datatable。如果是,则说明如何,如果否,还说明我的其他选项。

否,这不是内置的。您需要先清理客户机上的数据或将其插入暂存表。

如前一张海报所述,这不是内置的。我通过以下方法实现了类似的目标:

接受包含所需数据的TableValuedParameter的SQL存储过程

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

因此,让我们假设我们的数据只是存储在people表中的人名。我们只有一个身份证和一个名字。我还假设这个表被称为“人”

下面是如何创建表值参数类型(在SQL Server中创建)

我现在创建存储过程:

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#创建大量数据:

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


祝你好运。

记录中的主键呢?记录没有主键吗?一种可能的解决方案是使表的列唯一。为此,我们必须在表上创建一个带有列名的索引,我们要检查其唯一性。是的,谢谢GinjaNinja。我明白你说的了。您能给我一个表值函数和SQL合并语句的代码示例吗。我使用的是Sql Server 2000和.net 2.0。我修改了上面的帖子,然后注意到您使用的是Sql 2000。这行不通,对不起!
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
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();
    }

}