我目前使用 OleDBCommand.ExecuteNonQuery(重复调用)从源 DataTable 一次将多达 350,000 行插入 dbase 文件 (*.dbf)。我正在重用 OleDbCommand 对象和 OleDbParameters 来设置每次调用插入语句时要插入的值。目前插入 350,000 行需要我的程序大约 45 分钟。
有没有更有效的方法来做到这一点?Dbase (*.dbf) 文件是否存在类似于 SQL Server 中使用的批量插入选项的内容?
我目前使用 OleDBCommand.ExecuteNonQuery(重复调用)从源 DataTable 一次将多达 350,000 行插入 dbase 文件 (*.dbf)。我正在重用 OleDbCommand 对象和 OleDbParameters 来设置每次调用插入语句时要插入的值。目前插入 350,000 行需要我的程序大约 45 分钟。
有没有更有效的方法来做到这一点?Dbase (*.dbf) 文件是否存在类似于 SQL Server 中使用的批量插入选项的内容?
通过将 OleDB 驱动程序从 Jet 更改为 vfpoledb 解决了该问题。这将总时间从 40 分钟缩短到 8 分钟。
vfpoledb 驱动和合并模块是从下面的链接下载的
http://www.microsoft.com/downloads/en/details.aspx?FamilyID=e1a87d8f-2d58-491f-a0fa-95a3289c5fd4
谢谢你的帮助。
如果它是给定表的 .dbf 和 .cdx 文件扩展名,则它可能是 Visual FoxPro 表,而不是专门的“dBase”。
如果是这种情况,VFP 允许“附加自”命令,看起来像这样......
使用 (yourTable) 从 SomeFile.txt 追加类型 csv
但是,也接受其他导入文件格式,例如 XLS、DELIMITED 等。
如果是这样,VFP 还允许使用 ExecScript() 命令,您可以在其中构建表示要执行的命令的字符串,然后像普通 PRG 一样运行它们。并非 VFP 命令库中的所有内容都可用,但足以满足您的需要。您将需要使用 VFP OleDb 提供程序,像您已经在做的那样建立连接。然后,构建一个类似...的脚本
String script = "[USE YourTable SHARED] +chr(13)+chr(10)+ "
+ "[APPEND FROM OtherTextSource TYPE CSV]";
然后,发出你的
YourConnection.ExecuteNonQuery( "ExecScript( " + script + " ) " );
如果传入源的结构与您预期的表不同,您还可以创建一个临时表(VFP 中的光标),其中列的顺序与输入源匹配,但具有相同的列名和数据类型它们将被拉入最终表,然后将其用作附加到最终表的基础... VFP 中的游标是自清洁的.. 即:它们是临时文件,在关闭时会立即删除,关闭连接将释放它们。 .. 如
String script = "[create cursor C_SomeTempArea( FinalCol1 c(20), "
+ "FinalCol7 int, AnotherCol c(5) )] +chr(13)+chr(10)+ "
+ "[APPEND FROM OtherTextSource TYPE CSV] +chr(13)+chr(10)+ "
+ "[SELECT 0] +chr(13)+chr(10)+ "
+ "[USE YourFinalTable] +chr(13)+chr(10)+ "
+ "[Append from C_SomeTempArea]"
然后,发出你的
YourConnection.ExecuteNonQuery( "ExecScript( " + script + " ) " );
编辑——来自反馈
因为它是基于 DBASE 的,所以我会考虑仍然下载 VFP OleDb 管理器,与上面的连接,但不是在最后使用你的表并附加到它,只更改结束部分......
消除
+ "[USE YourFinalTable] +chr(13)+chr(10)+ "
+ "[Append from C_SomeTempArea]"
并把 int
+ "[COPY TO TEMPImport TYPE FOXPLUS]"
FOXPLUS 类型的副本会将其放入磁盘上的物理表中,DBASE 将通过其 OleDb 提供程序识别该表。然后,回到与您的数据库的连接,我会做一个
insert into (YourTable) select * from TempImport
是的,它涉及一个新的 OleDb 提供程序,但是 VFP SCREAMS 在执行此类导入时表现出色而不会出汗......
根据您的其他反馈,作为 SQL Server,SQL Server 具有批量上传功能。
我将创建一个存储过程,该过程需要您尝试上传的文件的名称并在那里完成所有操作。以与我描述的 Foxpro 类似的方式,我将在 SQL 中创建一个与要导入的列匹配的临时表(如果需要更快地预填充数据),然后导入到该表中。一旦进入临时结构,您就可以对所需的数据进行任何清理。准备好后,作为临时导入表中的选择插入到主表中。