我正在尝试使用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,但我可以尝试另一种方法,希望不会伤害我的架构(最终,如果我找不到办法,我将不得不做出这样的牺牲)。
感谢您的关注,我已准备好回答对我的情况的疑虑。
答案 0 :(得分:1)
所以我解决了我的问题(感谢#J-D)。 我基本上使用临时表并在其中插入数据。首先,我每次使用时都会截断它:
Second done!
Third done!
First done!
Nested done!
Async done!
All done!
然后我使用我之前创建的方法插入数据:
connection.Query(database_name, sql_truncate_query);
OBS:将方法名称从BulkInsertOrUpdate更改为BulkInsert。
稍后,我使用简单的MERGE SQL查询更新我的日志表:
connection.BulkInsert(database_name, ienumerable, table_name);
OBS:我的问题在我开发时发生了变化,因此我不再使用'更新'功能,我只需要检查行的存在。当然,您可以编写一个代码,如果它被WHERE子句捕获,它会更新该值。
我不知道它是否是解决此问题的优化方法,但它肯定比一次插入或更新每行更好。