0

假设我在一个文本文件中有数十万条记录,我想每天将其插入数据库。其中大约一半已经存在于数据库中。此外,使用 6 列定义唯一行。

在这种特殊情况下,在 .NET 中编写插入代码的正确方法是什么?我想知道的两个是:

我是否立即进行 SQL 插入并捕获重复条目的 SQLException?在这种情况下,我将打破例外情况应仅用于例外情况而不用于常见情况的概念。

或者

在进行插入之前,我是否先进行 SQL 选择以检查行?在这种情况下,尽管刚刚完成了选择,但数据库似乎会自动执行第二次插入并检查唯一性。

4

3 回答 3

1

使用 sql 语句在插入之前检查该行。这是一个名为 person 的表的简单示例,该表有两列,名字和姓氏,它们被检查唯一性:

/// <summary>
/// Insert a row into the person table
/// </summary>
/// <param name="connection">An open sql connection</param>
/// <param name="forename">The forename which will be inserted</param>
/// <param name="surname">The surname which will be inserted</param>
/// <returns>True if a new row was added, False otherwise</returns>
public static bool InsertPerson(SqlConnection connection, string forename, string surname)
{
    using (SqlCommand command = connection.CreateCommand())
    {
        command.CommandText =
            @"Insert into person (forename, surname)
                Select @forename, @surname
                Where not exists 
                    (
                        select 'X' 
                        from person 
                        where 
                            forename = @forename 
                            and surname=@surname
                    )";
        command.Parameters.AddWithValue("@forename", forename);
        command.Parameters.AddWithValue("@surname", surname);

        int rowsInserted = command.ExecuteNonQuery();

        // rowsInserted will be 0 if the row is already in the database
        return rowsInserted == 1;
    }
}
于 2013-02-16T11:10:38.113 回答
0

忽略重复项的一种简单方法是使用选项 IGNORE_DUP_KEY=ON 创建唯一索引。这样您就不会产生重复测试或捕获异常的开销。

例如

CREATE UNIQUE NONCLUSTERED INDEX [IX_IgnoreDuplicates] ON [dbo].[Test]
(
    [Id] ASC,
    [Col1] ASC,
    [Col2] ASC
)
WITH (IGNORE_DUP_KEY = ON) 

然后,您还可以使用BULK INSERT通过自动重复删除有效地加载所有数据。

请参阅创建索引

于 2013-02-16T13:03:42.187 回答
0

我认为你应该选择异常方式。做这样的事情:

foreach(var elem in elemntsFromFile)
{
    try
    {
       context.sometable.Add(elem);
       context.SaveChanges();
    }
    catch
    {
    }
}

一瞬间。我不喜欢 db.saveChanges 在每次迭代中运行,但它会在 100% 上具有比“选择优先的方式”更好的性能。它也将工作和工作。

于 2013-02-16T10:43:21.207 回答