【发布时间】:2020-03-12 23:01:06
【问题描述】:
客户给了我一个 Excel 文件。它有 4 列:ID、名称、地点、日期)。
我的数据库中有一个存储这些值的表。我必须检查 Excel 中的每一行并将其值与数据库表进行比较。如果行已存在,则比较日期并从 Excel 更新为最新日期。如果该行尚不存在,则插入一个新行。
我正在获取每一行并使用 for 循环比较其值,并通过创建数据表适配器使用插入/更新语句更新数据库。
我的问题是此操作需要 4 多个小时才能更新数据。有没有有效的方法来做到这一点?我搜索了很多,找到了SqlBulkCopy 之类的选项,但是我将如何比较数据库中的每一行?
我正在使用带有 C# 和 SQL Server 的 ASP.NET。
这是我的代码:
for (var row = 2; row <= workSheet.Dimension.End.Row; row++)
{
// Get data from excel
var Id = workSheet.Cells[row, 1].Text;
var Name = workSheet.Cells[row, 2].Text;
var Place = workSheet.Cells[row, 3].Text;
var dateInExcel = workSheet.Cells[row, 4].Text;
// check in database if ID exists in database then compare date and update database>
if (ID.Rows.Count <= 0) //no row exist in database
{
// Insert row in the database using data table adapter's insert statement
}
else if (Id.Rows.Count > 0) //Id exists in database
{
if (Db.DateInDB < (dateUpdate)) // compare dates
{
// Update database with the new date using data table adapter Update statement.
}
}
}
【问题讨论】:
-
SqlBulkCopy 到临时表中。合并到目标表中。
-
目标表中有多少条记录?
-
与@mjwills 提到的一种类似的技术是将 Excel 数据加载到
DataTable并作为表值参数传递以在 T-SQLMERGE语句中使用。见this example。 -
@DanGuzman 好电话。有点慢,但通常更容易编写。
-
@tymtam:目标表没有记录。我每个月都会收到这个文件,所以第一次插入后记录会大大增加。
标签: c# asp.net sql-server excel