【问题标题】:Inserting a lot of data from gridView to Database in small time在很短的时间内将大量数据从 gridView 插入数据库
【发布时间】:2014-02-03 02:17:00
【问题描述】:

事情是这样的,目前我正在开发某种应用程序,我必须从 Excel 工作表上传数据,并将其保存到数据库表 (oracle) 中。我设法通过 OracleDataAdapter 类完成了这个过程

 _adapter = new OracleDataAdapter(query, _conn);
_adapter.Update(_dataTable);

但是,保存在 gridView 中加载的数据需要很长时间,例如 12 分钟保存 100000 个注册表。然后我尝试了OracleBulkCopy,它确实在大约 10 到 15 秒内完成了工作,但问题在于它不尊重数据库中的主键。我尝试了一切,但它不尊重约束。

我也尝试自己做这样的插入方法:

OracleCommand cmdInsert = new OracleCommand();
cmdInsert.CommandText = query;
cmdInsert.Connection = DataAccess._conn;

OracleParameter id_Filtro = new OracleParameter();
cmdInsert.Parameters.Add(id_Filtro);

foreach (DataRow r in _table.Rows)
{              
    id_Filtro.DbType = DbType.Int32;
    id_Filtro.Value = Convert.ToInt32(r["ID_FILTRO"].ToString());
    id_Filtro.ParameterName = "id_Filtro ";
    cmdInsert.ExecuteNonQuery();
}

我对每个参数都做了同样的事情,但插入所有数据也需要很长时间,大约 25 分钟左右。我想知道是否有更好的方法来完成这个过程。如果有人可以帮助我,我将不胜感激。我可以更新帖子以澄清任何询问,请注意我不是数据库或程序员专家。

【问题讨论】:

  • it takes a lot of time to save the data loaded in the gridView, like 12 min for 100000 registries - 你可能有兴趣观看this short clip
  • BulkCopy 是获取该卷的正确方法。最好分开你的步骤。不要将其直接加载到目标表中。将其加载到工作表中,然后根据需要使用存储过程按摩到目标表中。
  • @dbugger 你能告诉我更多吗?
  • 您已经了解了如何使用 BulkCopy 将数据导入数据库。这样做,但要进入一个包含源数据列的工作表。然后您可以使用 SQL 语句选择有效数据并将其插入到目标表中。正如@OracleUser 所说,BulkCopy 采用一些捷径来快速获取数据,因此您需要在加载数据之前确保数据是原始的,或者只是将其放入并在之后清理。

标签: c# oracle gridview sql-insert visual-studio-project


【解决方案1】:

OracleBulkCopy 似乎使用了类似的 SQL*Loader 概念(Oracle 实用程序可以更快地加载批量数据)。此实用程序会将索引和约束设置为 UNUSABLE(除了少数检查约束)并在完成后重新启用它。

因此,在您启动加载过程后,您的索引将被标记为不可用。因此不利的一面是,它绕过了主键验证并且容易允许重复。

因此,请尝试在加载之前验证您的数据源。程序也可以选择。您甚至可以尝试将 BULK 加载到临时表并插入到 select... 到您的目标表中。

【讨论】:

    猜你喜欢
    • 2015-11-27
    • 2011-09-21
    • 1970-01-01
    • 2013-11-22
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    • 1970-01-01
    • 2012-10-06
    相关资源
    最近更新 更多