熟悉dbf的朋友们,帮帮忙吧!(100分)

  • 主题发起人 主题发起人 xiaocai
  • 开始时间 开始时间
X

xiaocai

Unregistered / Unconfirmed
GUEST, unregistred user!
前两天,跟朋友喝酒,半梦半醒中,跟哥们儿拍了胸脯,帮他作个小系统用于数据转移
朋友有个小店,用的是一台NT4的服务器共享一个dbf文件,两台N老的POS机跟它用一个10M的小HUB相连,不与互联网相通。
我看了,POS机用的是PC DOS7,上面跑的收银程序是FOXPRO 2.5开发的,数据库指向服务器的共享目录,数据内容很简单,就是那天几点几分,那个人收了多少银子,按日期存的,十几万条数据(从01年至今),没有索引。
朋友的要求也很简单,因为老怕会电脑的工商来查帐,所以希望能用一个笔记本,按他需要的日期把数据从服务器中复制出来,并且删除掉相应日期前的数据。
我觉得很简单啊,就答应他了,他说请我吃好的,我说一个礼拜~小意思~

回家开始做,太久没碰DELPHI了,生了,熟悉了一会儿,想起当年的艰苦奋斗来了,呵呵,但是事情也来了,我想用BDE,然后两个DATABASE_SOURCE,DATABASE_DESTINATION,再分别用QUERY_SOURCE->DATABASE_SOURCE,TABLE_DESTINATION->DATABASE_DESTINATION,连接了,简单,然后放个BATCHMOVE 进去,就行了,BDE的配置我就不说了,都没什么问题。
可是运行结果让我很吃惊,复制过去的数据中有中文数据项的都是乱码,而且复制完的DBF文件用Database Desktop能够打开,用VFP 6就说“不是一个表文件”~~
现在拜托大家帮忙以下几个问题:
1、table_destination的TableType需要调整成ttFoxpro吗,还是ttDefault?ttDbase?
2、BDE中的文件驱动,用什么?是Microsoft dbase Driver还是Microsoft Foxpro VFP Driver?还是Microsoft dbase VFP driver?这几个有什么重大的区别吗?
3、我用query_source "select * from xxx.dbf"时有时会出现"key violation"的错误,是啥东西?为什么?
4、目标数据库复制后为什么会中文乱码?我把BDE的LANGUAGE都设置成dbase cp936啦

谢谢大家啦,我很想吃大餐啊!!呵呵
 
对了,如果大家能对速度的提高有帮助的建议,我一并感谢!
 
用vfp6.0操作不就完成了,导入sql server
 
VFP我完全不会啊,我总不能给我那电脑菜鸟的朋友说,你笔记本上装个SQL SERVER吧,我给你编个SQL 脚本,你每次用查询分析器运行一下就可以了,咱编软件的,总不能用程序员的标准来要求最终用户吧,我希望我的界面简单到一个TDATETIMEPICKER控件,请朋友选择要转移数据的日期,一个TBUTTON,按一下,提示转移成功,行了,至于后台干什么,对于朋友来说应该是透明的。
 
其实用VFP6直接复制表或数据库的方法是最简单的。
使用SELECT * from 源表名 INTO TABLE 目的表名,然后复制目的表就行了
 
真是奇怪,怎么都在跟我说VFP啊,我问的问题没回答,所答非所问

前提:要编出计算机用的不好的人都能简单使用的一个一键转移数据式的程序,再者,我不会用VFP编程,这里可是DELPHI的论坛啊。
 
DBF扩展名是VFP数据库。
一般的操作VFP数据库会经常出错。
可以用下面的:
2。用ado连接dbf数据库文件;(不用odbc,配置麻烦)

adoconnection1.ConnectionString :='Provider=MSDASQL.1;Driver=Microsoft Visual Foxpro Driver;SourceType=DBF;SourceDB='+extractfilepath(application.ExeName)+'data';
adoconnection1.Connected :=true;

adotable3.TableName :='song.dbf'; //song.dbf
adotable3.Active :=true;

如果没有visual foxpro 驱动,可以到microsoft下载专门驱动,几百k吧。
你试试。
 
to happycyp : visual foxpro 的驱动?AdoConnection 在XP或是WIN2000下没有自带吗?VFP的光盘里有吗?
 
1、反对 happycyp 的说法!
.DBF是 Foxpro和Foxbase系列的扩展名,而不仅是 VFP.

2、zhangwei200607 说的语句好像也可以在 Foxpro 2.5/2.6下用,楼主可以试试。
3、既然他原来是Foxpro做的,楼主可以用FoxPro系列来作呀,Foxpro里面有 input等接受键盘输入的语句;
4、另外,你说的驱动,我几年前用过,你可以一一试试嘛,才几个而已----你有大餐我们却没有。不过,好像那驱动是直接选择文件名的那个,而不是要选什么 ODBC的那种。

另请楼主帮我也看看
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3517576
 
呵呵,SELECT .. INTO ..要是能支持我就不提问了,实际上我最头疼的就是batchmove的问题,这个东西好像不是非常的稳定,数据量稍微一大就会出现问题,所以我希望用BDE能够找到一个更好的办法,对了,我不能使用ADO,因为将数据转移走以后程序还应该自动对服务器上的数据文件PACK一下,好像ADO对此无能为力,只有BDE可以选择了,而且,我记得ADO只是连SQL SERVER和ACCESS比较有优势,剩下的数据库ADO的效率比较差,不考虑了。
 
算了,上面的问题完毕吧,谁帮忙说一下我这个问题吧,能结贴了
源库文件有字段是sale_date,用的是日期型的字段,长度8位,现在我的程序如果用query是这样的 select * from t_source where sale_date<:p1
parambyname('p1').asdate:=datetimepicker1.date;
如果一执行,就会报key violation 错误,为什么啊?
我实验了一下AsString:=formatdatetime('yyyy-mm-dd',datetimepicker1.date);也不行,AsVariant也不行,那么怎么才能让这个日期参数传递给数据库让程序知道我需要的日期条件啊?
 
FoxPro文件中日期表示为:mm/dd/yy
 
FOXPRO中可以指定日期的格式的,很简单。
另外,楼主这个还是用FOXPRO搞好很多啊,几句话就搞定了,哪里要用DELPHI写什么程序啊。这几句话编译成程序也可以一键BACKUP/RESTORE嘛。
 
日期前后加 ‘#’试试
 
to weiliu:呵呵,FOXPRO不会用,再简单也需要先学习啊,耽误了时间对不起哥们儿
指定格式俺知道一点点儿,好像是{^2006-01-01}叫什么标准格式
那个key violation的问题已经解决了,谢谢啦,我现在不管它什么效率了,全部用asString来转换,虽然慢点儿,可是总算把数据都成功转过去了。

居然在删除旧数据的时候碰到一个问题,程序
q.Close;
q.SQL.Clear;
q.SQL.Add('delete from t_source where sale_date<=:p1');
q.ParamByName('p1').AsString:=formatdatetime('yyyy-mm-dd',datetimepicker.Date);
q.ExecSQL;
执行->> key violation
 
在继续实验的过程中发现如下情况:
数据库的sale_date数据到2006-06-01, 如果datetimepicker选择的日期小于这个数据,则删除的时候正常,如果大于这个日期,例如今天,那么删除的时候就会报key violation,但是如果数据库里一条数据都没有,那么执行带sale_date<:p1的SQL倒是也不会报错,这是咋回事儿啊,怪!我用VFP看了源库的结构,没有索引字段,也没有主键,也没有任何not null的字段
 
首先你这个问题很简单;简直太简单了;应该两个小时不到就能搞定的东西,这也叫程序?完全是个试验;
1、vf本来就可以不用索引,因为它内部带有的隐藏索引性质;
2、因为vf是以文件形式表现数据表的,所以你要搞清楚,它的那个收银系统的数据结构;
3、最后做个程序先把数据库文件复制到笔记本上,连接服务器上的数据库,将此数据库导入到你的数据库内,并将其清空;
4、以后每次就用追加即可;不过每次的dbf文件望保存,以防自己的文件损坏、丢失、机器中毒之类的;
就这么简单;
还有楼主你下次不要喝那么多,小心把自己给卖了;你要是太久没摸delphi,大可用你熟悉的语言来写,C#,java也行;
 
to 清新空气:嘿嘿,谢谢,我现在熟悉java/php,可是操作DBF还是DELPHI快啊,你这招儿是曲线救国,另辟蹊径,可是我现在想知道,为什么delete from t_source where sale_date<:p1居然会出现key violation错误,说说说说说!

总不会说是DBF不支持日期的< > <> =的操作吧!
 
清空dbf数据表不能这么做!
 
我知道我知道,我现在需要delete ,然后pack ,这个我都做了,我现在只想知道为什么delete from t_source where sale_date<:p1为什么为什么会说key violation
 
后退
顶部