5

我目前使用 OleDBCommand.ExecuteNonQuery(重复调用)从源 DataTable 一次将多达 350,000 行插入 dbase 文件 (*.dbf)。我正在重用 OleDbCommand 对象和 OleDbParameters 来设置每次调用插入语句时要插入的值。目前插入 350,000 行需要我的程序大约 45 分钟。

有没有更有效的方法来做到这一点?Dbase (*.dbf) 文件是否存在类似于 SQL Server 中使用的批量插入选项的内容?

4

3 回答 3

2

通过将 OleDB 驱动程序从 Jet 更改为 vfpoledb 解决了该问题。这将总时间从 40 分钟缩短到 8 分钟。

vfpoledb 驱动和合并模块是从下面的链接下载的

http://www.microsoft.com/downloads/en/details.aspx?FamilyID=e1a87d8f-2d58-491f-a0fa-95a3289c5fd4

谢谢你的帮助。

于 2011-03-27T12:06:09.407 回答
1

如果它是给定表的 .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 在执行此类导入时表现出色而不会出汗......

于 2011-03-09T14:10:47.080 回答
1

根据您的其他反馈,作为 SQL Server,SQL Server 具有批量上传功能。

我将创建一个存储过程,该过程需要您尝试上传的文件的名称并在那里完成所有操作。以与我描述的 Foxpro 类似的方式,我将在 SQL 中创建一个与要导入的列匹配的临时表(如果需要更快地预填充数据),然后导入到该表中。一旦进入临时结构,您就可以对所需的数据进行任何清理。准备好后,作为临时导入表中的选择插入到主表中。

于 2011-03-10T13:40:24.163 回答