使用BulkCopy插入对象或如果已存在则更新(C#,SQL)

3

我正在尝试使用 List<T> 更新表格。我创建了一个EnumExtension类,并创建了一个方法,将我的Enumerable转换为DataTable:

public static DataTable AsDataTable<T>(this IEnumerable<T> data)...

接下来,我开始创建一个方法,该方法应使用BulkCopy将可枚举对象插入或更新到我的表中。目前,它的代码如下:

public void BulkInsertOrUpdate(DatabaseEnum database, IEnumerable<Object> enumerable, string TableName)
    {
        var connection = this.GetSqlConnection(database);

        var transaction = connection.BeginTransaction();

        using (var bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default, transaction))
        {
            bulkCopy.BatchSize = 100;
            bulkCopy.DestinationTableName = TableName;
            try
            {
                bulkCopy.WriteToServer(enumerable.AsDataTable());
            }
            catch (Exception)
            {
                transaction.Rollback();
                connection.Close();
            }
        }
        transaction.Commit();
    }

(注意:GetSqlConnection方法使用适当的连接字符串创建并打开了我的连接。)

但我不知道如何创建更新功能。有没有一种简单有效的代码方式可以实现?虽然我喜欢BulkCopy,但我也可以尝试其他方法,希望不会影响我的架构(如果找不到其他方法,最终我将不得不做出这个牺牲)。

感谢您的关注,我准备回答关于我的情况的疑问。


通过谷歌搜索了解如何使用 XML 插入批量记录到数据库中。这样,即使数据库未启用批量插入,也可以通过将 XML 文件传递给数据库上的存储过程来插入所有记录。 - MethodMan
1
这个可能会回答你的问题https://dev59.com/tWIj5IYBdhLWcg3wGRiM。但从我的个人观点来看,@Locke给出的答案更为合适。在你的情况下,你也可以利用MERGE语句。 - J-D
感谢J-D的指导。我正在使用临时表来批量插入我的数据。之后,我将使用WHERE子句将此表合并到我的日志表中。 - Lucas Garcia
1个回答

2

感谢 #J-D,我解决了我的问题。 我基本上是使用临时表,并在其中插入数据。每次使用前首先将其清空:

connection.Query(database_name, sql_truncate_query);

然后我使用之前创建的方法插入数据:

connection.BulkInsert(database_name, ienumerable, table_name);

OBS:方法名称从BulkInsertOrUpdate更改为BulkInsert。

稍后,我使用简单的MERGE SQL查询更新我的日志表:

INSERT [database].[table]  (col1, col2)
SELECT col1, col2
FROM [database].[table2] t2 
WHERE NOT EXISTS (SELECT col1 FROM [database].[table] t1 WHERE t1.col1= t2.col1);

OBS:在开发过程中,我的问题发生了改变,因此我不再使用“update”功能,只需要检查行是否存在。当然,你可以编写一个代码,在WHERE子句捕获到它时更新值。

我不知道这是否是解决这个问题的最优方式,但肯定比逐个插入或更新每一行要好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接