如果已使用BulkCopy(C#,SQL)已存在INSERT对象或UPDATE

c# sqlbulkcopy sql-server

我正在尝试使用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:Method GetSqlConnection使用适当的连接字符串创建并打开我的连接。)

但我不知道如何创建更新功能。有一个简单的方法,有效的代码吗?我喜欢BulkCopy,但我可以尝试另一种方法,希望不要伤害我的架构(最终,如果我找不到办法,我将不得不做出这样的牺牲)。

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

一般承认的答案

所以我解决了我的问题(感谢#JD)。我基本上使用临时表并在其中插入数据。首先,我每次使用它时都会截断它:

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子句捕获,您可以编写一个代码来更新值。

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



许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因