使用 BulkCopy 插入对象或更新对象(如果它已存在)(C#,SQL)
INSERT object or UPDATE if it already exists using BulkCopy (C#, SQL)
我正在尝试用 List<T>
更新 table。我创建了一个 EnumExtension class 并创建了一个将我的 Enumerable 转换为 DataTable 的方法:
public static DataTable AsDataTable<T>(this IEnumerable<T> data)...
然后我开始创建一个方法,该方法应该使用 BulkCopy 来插入或更新我的 table,使用可枚举的。现在,它是这样写的:
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)。
我基本上使用临时 table 并将数据插入其中。首先,每次使用时我都会截断它:
connection.Query(database_name, sql_truncate_query);
然后我使用之前创建的方法插入数据:
connection.BulkInsert(database_name, ienumerable, table_name);
OBS:将方法名称从 BulkInsertOrUpdate 更改为 BulkInsert。
稍后,我使用简单的 MERGE sql 查询更新我的日志 table:
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 子句捕获。
我不知道这是否是解决此问题的优化方法,但肯定比一次插入或更新每一行要好。
我正在尝试用 List<T>
更新 table。我创建了一个 EnumExtension class 并创建了一个将我的 Enumerable 转换为 DataTable 的方法:
public static DataTable AsDataTable<T>(this IEnumerable<T> data)...
然后我开始创建一个方法,该方法应该使用 BulkCopy 来插入或更新我的 table,使用可枚举的。现在,它是这样写的:
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)。 我基本上使用临时 table 并将数据插入其中。首先,每次使用时我都会截断它:
connection.Query(database_name, sql_truncate_query);
然后我使用之前创建的方法插入数据:
connection.BulkInsert(database_name, ienumerable, table_name);
OBS:将方法名称从 BulkInsertOrUpdate 更改为 BulkInsert。
稍后,我使用简单的 MERGE sql 查询更新我的日志 table:
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 子句捕获。
我不知道这是否是解决此问题的优化方法,但肯定比一次插入或更新每一行要好。