我正在构建一个与Oracle 11g数据库对话的.NET应用程序。我试图从第三方提供的Excel文件中获取数据并进行upsert(UPDATE
记录,如果存在,INSERT
,如果没有),但是在性能方面遇到了一些问题。
这些Excel文件将替换关税代码和描述,因此每个文件中有几千条记录。
| Tariff | Description |
|----------------------------------------|
| 1234567890 | 'Sample description here' |
我做了一些关于批量插入的研究,甚至写了一个函数,它在应用程序中打开一个事务,执行一堆UPDATE
或INSERT
语句,然后提交。不幸的是,这需要很长时间并且会延长应用程序和数据库之间的会话。
public void UpsertMultipleRecords(string[] updates, string[] inserts) {
OleDbConnection conn = new OleDbConnection("connection string here");
conn.Open();
OleDbTransaction trans = conn.BeginTransaction();
try {
for (int i = 0; i < updates.Length; i++) {
OleDbCommand cmd = new OleDbCommand(updates[i], conn);
cmd.Transaction = trans;
int count = cmd.ExecuteNonQuery();
if (count < 1) {
cmd = new OleDbCommand(inserts[i], conn);
cmd.Transaction = trans;
}
}
trans.Commit();
} catch (OleDbException ex) {
trans.Rollback();
} finally {
conn.Close();
}
}
我通过Ask Tom发现,这样做的有效方法是使用在9i中实现的Oracle MERGE
语句。据我所知,这只能使用Oracle中的两个现有表。我已经尝试但不了解临时表或者是否可能。如果我在MERGE
创建一个只保存数据的新表格,我仍然需要一种可靠的批量插入方法。