c# - 使用 BulkCopy(C#、SQL)插入对象或更新(如果它已存在)

标签 c# sql-server sqlbulkcopy

我正在尝试使用 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();
    }

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

但我不知道如何创建更新功能。有没有一种简单的方法可以使用高效的代码来做到这一点?我喜欢 BulkCopy,但我可以尝试另一种方法,希望不会损害我的架构(如果我找不到方法,最终我将不得不做出这种牺牲)。

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

最佳答案

所以我解决了我的问题(感谢#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:我的问题在开发过程中发生了变化,所以我不再使用“更新”功能,我只需要检查该行是否存在。当然,您可以编写代码,在其中更新值,如果它被 WHERE 子句捕获。

我不知道这是否是解决此问题的优化方法,但肯定比一次插入或更新每一行要好。

关于c# - 使用 BulkCopy(C#、SQL)插入对象或更新(如果它已存在),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33027246/

相关文章:

c# - 如何在 C# LDAP 中对用户进行身份验证

c# - 生成唯一的随机数

sql-server - 通过 bacpac 导入创建的 Azure SQL 数据库失败

mysql - 在 SQL Server 的 MySQL 服务器上使用 EXECUTE ('UPDATE..' ) 时出现错误

SQL CLR SqlBulkCopy 从数据表

.net - SqlBulkCopy:传递 SqlBulkCopyOptions.UseInternalTransaction 和不传递它有什么区别?

c# - OfType<> 与 NHibernate Proxy 类不能很好地配合

c# - 捕获委托(delegate)的所有返回值

sql - SQL如何在相似数据库之间快速导入数据?

c# - SqlBulkCopy 插入顺序