通过oledb for vfp执行VFP的传统命令的问题

liups 2008-01-14 08:27:13
类似某个兄弟的问题
http://topic.csdn.net/u/20071227/10/d2a9e466-856d-4fe1-91a5-38139bf13aea.html

查文档发现,recall、COPY TO等命令是支持的,可是这种命令总是要选USE一下,事实至少是两个命令,可是不管怎样总是无法执行后面一个命令!网上的例子多半是一个SQL命令,所以没办法。
求解决方案

上面那个帖子中提出使用OLE技术,的确可以实现功能,就别拿来说事了
(如下代码是delphi中实现并通过的,其他语言类似):
oFoxPro:=CreateOleObject('VisualFoxPro.Application');
oFoxPro.DoCmd('USE '+s1+' ');
oFoxPro.DoCmd('Recall all');
oFoxPro.Quit;
oFoxPro:= Unassigned;

不过此方法必须安装VFP9.0,且效率较低(要通过OLE方式启动VFP),乃是下策!


希望的方案,类似以下代码(这个命令单独一条搞定,通过):
adoconnection1.Execute('pack splqk');

两条的例子,总是不行啊(第二条失败)
adoconnection1.Execute('use splqk');
adoconnection1.Execute('recall all');




...全文
605 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
都市夜猫 2008-12-04
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 aabiao 的回复:]
怎么总是想到OLEDB呢,用VFP写几句,编译成DLL,Delphi调用很方便呀!
[/Quote]

这才是高手的想法!MS 以前一直都是这样规划的,把 vfp 作为编写中间层部件的工具,能调用 COM 组件的开发工具都可以使用这种 dll
aabiao 2008-12-04
  • 打赏
  • 举报
回复
怎么总是想到OLEDB呢,用VFP写几句,编译成DLL,Delphi调用很方便呀!
十豆三 2008-04-07
  • 打赏
  • 举报
回复
我做了一个MyPack
http://www.access911.net/CSDN/filedescription.asp?mdb=2008-3-1&id=35&mode=3
*在VFP中调用:

DECLARE INTEGER ShellExecute IN SHELL32.DLL INTEGER nWinHandle,STRING cOperation,STRING cFileName,STRING cParameters,STRING cDirectory,INTEGER nShowWindow
=ShellExecute(0,"Open","d:\MyPack\MyPack.exe","d:\test\abc.dbf","",0)
CLEAR DLLS


*在VB中调用:
Shell "d:\MyPack\MyPack.exe d:\test\abc.dbf"


需要注意:
调用前要被PACK的表不能被其他程序打开,不管是共享打开,还是独占打开。
假如你要对表ABC.DBF进行PACK
如果有程序打开这个表,必须先关闭,然后再用MyPack.exe对这个表进行Pack。

WWWWA 2008-01-18
  • 打赏
  • 举报
回复
adox:
var rr,rr1:variant;ff:string;i:integer;
begin
rr:=CreateoleObject('ADOX.Catalog');
ff:='Provider=VFPOLEDB.1;Data Source=d:\zz;Collating Sequence=MACHINE';
rr.ActiveConnection:='Provider=VFPOLEDB.1;Data Source=d:\zz;Collating Sequence=MACHINE';
for i:=0 to rr.tables['dd'].Columns.Count-1 do
begin
showmessage(rr.tables['dd'].columns[i].name+' '+inttostr(rr.tables['dd'].columns[i].type))
end;
end;
WWWWA 2008-01-18
  • 打赏
  • 举报
回复
ado:
procedure TForm1.Button1Click(Sender: TObject);
begin
adoConnection1.OpenSchema(siColumns,VarArrayOf([Unassigned , Unassigned, 'dd',Unassigned]),EmptyParam,adoDataset1);
adoDataSet1.Active:=True;
showmessage(inttostr(adoDataSet1.RecordCount));
while not adodataset1.Eof do
begin
showmessage(adodataset1.FieldByName('COLUMN_NAME').AsString+' '+adodataset1.FieldByName('data_type').AsString);
adodataset1.Next;
end;
end;

WWWWA 2008-01-18
  • 打赏
  • 举报
回复
1、由于上报者可能误加删除标记,导致接收者在导入其它库(比如Oracle)时漏掉这些数据,程序中要查找这些记录并恢复删除;

可以考虑增设一个标志字段,删除为一个值,否则为另一个值

2、程序要取表的结构进行比较
3、由于表本身不定,字段名、类型等也需要由程序取出
做为DELPHI程序员,你不会不知道用ADO、ADOX取吧?
等一下给你做一个示例。

WWWWA 2008-01-17
  • 打赏
  • 举报
回复
仔细看看,那是在储存过程中:
adocommand1.CommandType:= CmdStoredProc;
adocommand1.CommandText:='dd';
adocommand1.Execute ;

DD:
USE ff
RECALL all
USE
已经测试通过
liups 2008-01-17
  • 打赏
  • 举报
回复
VF9自带帮助中有讲:

Supported Visual FoxPro Commands and Functions in OLE DB Provider

Commands and Functions for Stored Procedures, Rules, Triggers, and Default Values


PACK Command
RECALL Command
SELECT Command
USE Command
都在其中

如果按字面意思,以上这些只能用在Stored Procedures等中的话,那PACK为何又可以直接执行!
十豆三 2008-01-17
  • 打赏
  • 举报
回复
可支持vfp的大部分命令,不是全部。
WWWWA 2008-01-17
  • 打赏
  • 举报
回复
不是所有的VFP命令OLEDB for vfp都支持的PACK可以,RECALL不行
ADOCOMMAND指向DBF,直接运行PACK即可。
liups 2008-01-17
  • 打赏
  • 举报
回复
现在是没法换数据库的,因为本系统要求报DBF自由表的,大家也一直用DBF,事实上现在程序已经大致完成,暂时用OLE方式调用VFP做的(1楼的方法),但是总是不太完美,做为理论上的探讨,觉得应该可以用VFP OLEDB实现,其他就的不用多说了
十豆三 2008-01-17
  • 打赏
  • 举报
回复
实在不好调试。不行就用VFP做个EXE,每次由Delphi调用外部程序的方法调用这个VFP的EXE,当然发布程序时也要带上相应的运行库。

如果每次执行的命令不太一样,就用文本当参数传递。如Delphi生成要执行的命令文本,然后调用VFP这个Exe时执行这个文本内的命令。

另外:能不能换个数据库。如Access等。
wwwwb 2008-01-17
  • 打赏
  • 举报
回复
1、取字段名、类型一般用ADOX、ADO的OPENSCHEMA,不用SQL,
VFP是桌面数据库,不象SQL SERVER、ORACLE、SYBASE等等有系统表,可以
用SQL语句查出列名、字段类型;
2、如果一定要用VFP实现,用VFP的命令编写存储过,在DELPHI程序中调用是最好的方法;
3、各种语言、数据库都有自己的优势,充分使用其长处才是正道,比如在VFP是简单的RECALL,
在DELPHI中要使用若干语句都能实现,我操作MDB,原来在VFP中,也很麻烦,后来学习ACCESS,
直接在ACCESS中操作,简单得多,希望你调整思路。
liups 2008-01-17
  • 打赏
  • 举报
回复
说明:我主要是delphi开发,又主要使用adoconnection和adoquery组件,用户是不太懂电脑的,程序主要功能是对任意两个大致相同的自由表进行数据一致性比较,表结构本身不固定,主要是用于比较上报和反馈的数据,反馈时可能对原库的结构和数据有少量的修改,通过这个程序,上报者可以知道数据是否正确上报,如果有修改,是否是正常的修改,因此至少需要如下功能:
1、由于上报者可能误加删除标记,导致接收者在导入其它库(比如Oracle)时漏掉这些数据,程序中要查找这些记录并恢复删除;
2、程序要取表的结构进行比较
3、由于表本身不定,字段名、类型等也需要由程序取出
VFP的SQL好象不能完成这些功能,只能由VFP命令实现,至于存储过程,不能指望用户完成,他们连库的概念都没有!

现在的情况是USE、PACK等一条就完成功能的VFP命令都没有问题,两个(及以上)连续执行的命令就不行,而且查文档(含MSDN网站上的)有的说可以(未加限定),有的说可以用在存储过程中!

迷茫中
liups 2008-01-17
  • 打赏
  • 举报
回复
PACK命令也是说在存储过程中,但是就可以直接用!

adoconnection1.Execute('pack splqk');
测试通过
liups 2008-01-15
  • 打赏
  • 举报
回复
关键是如何做,反正我是找不到方法的,
http://topic.csdn.net/u/20071227/10/d2a9e466-856d-4fe1-91a5-38139bf13aea.html
的那个兄弟也找不到!
十豆三 2008-01-15
  • 打赏
  • 举报
回复
应该是可以的:

用oledb for vfp(如9.0 Microsoft OLE DB Provider for Visual FoxPro 9.0)连接,可支持vfp的大部分命令
不是oledb for odbc

oledb for vfp下载地址:
http://www.microsoft.com/downloads/details.aspx?FamilyId=E1A87D8F-2D58-491F-A0FA-95A3289C5FD4&displaylang=en

File Name: vfpoledb.exe
Version: 1.1
Date Published: 1/5/2006
Language: English
Download Size: 2.5 MB

安装完oledb for vfp后,建一ado连接,选oledb for vfp,如果是数据库,连接到数据库,如果是自由表,连接到自由表所在目录,然后建一ado command或用ado连接的execute方法

2,723

社区成员

发帖
与我相关
我的任务
社区描述
VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
社区管理员
  • VFP社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧