首页 新闻 会员 周边

通过OleDbConnection 读取dbf文件的问题

0
悬赏园豆:20 [待解决问题]

基本情况:
(1)连接vfp数据 (s_stock.dbc)
(2)使用OleDbConnection、OleDbDataAdapter获取数据,赋值给DataTable
(3)语句1:select * from stock (4)语句2: select * from stock where partno = '123456' (4)连接串:connectString = @"Provider=VFPOLEDB.1;Data Source=" + filepath + ";Collating Sequence=MACHINE;Exclusive=NO;TABLEVALIDATE=0;"

问题情况:
(1)无论用语句1和语句2 获取数据,在OleDbDataAdapter.Fill(dt)时,内存都在涨,占用了大概200M的空间(dbf文件大概也是200M),好像是要读入整个dbf文件,才进行where的过滤。
(2)要对stock表插入几条新增记录,循环执行insert into 语句,每次循环插入,观察内存占用,执行后第一条insert ,内存会降低,开始执行第二条时,又会重新涨到200M,好像是每次执行insert语句都会重新读取dbf。
(3)我把数据放在本地和异地(共享文件夹方式)都试过,结果还是一样。

疑问(本人能力有限,请莫见怪):
(1)为什么两条select语句,都会读入整个dbf文件?莫非语句2的where没有走索引?
(2)insert into语句也需要读入整个dbf 文件?
(3)推测:vfp的数据库,是文档型数据?如果是的话,那就没有存储引擎一说。那OleDbConnection是直接使用解析后的sql语句,读写dbf文件 ? 还是先读入整个dbf文件,形成可供sql语句运行的数据环境,再把结果写入dbf文件?
(4)好像我的推测也不对,如果是dbf文件大小有1G,岂不是要1G的运行内存?
(5)主要是不明白OleDb读写dbf的原理不明白(在那个阶段、如果读写数据,又如何写入dbf文件)

小棋的主页 小棋 | 初学一级 | 园豆:46
提问于:2018-12-14 10:34
< >
分享
所有回答(1)
0

我建议呀,别研究了,别用OleDbConnection,可以找到很多开源的dbf操作类库,比如https://github.com/SocialExplorer/FastDBF。dbf有索引吗?应该没有吧,反正我没注意过。就算没有索引,其实也可以不用一次性读入内存,一部分一部分处理也可以,如果无法控制,不如换个能控制的类库。

我现在也有个功能是读dbf的,不过不是过滤出一部分,是读取全部内容,我用的fastdbf这个类库,每次读取7000行,直到读完,内存不会被占用多少

会长 | 园豆:12401 (专家六级) | 2018-12-14 11:00
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册