当前位置:网站首页>VFP在64位win10环境下访问oracle出现的问题及解决方案

VFP在64位win10环境下访问oracle出现的问题及解决方案

2022-06-09 20:25:00 加菲猫的VFP

作者:绿茶@狐友会
前期曾经使用VFP在64位WIN7环境下连接和访问oracle,无论是账套设置、还是使用代码远程访问数据,都没有出现过任何问题,近期换了台机器,安装了64位WIN10系统,仍按以前的套路,在测试连接和访问数据库时,却总是出现问题,折腾了好几天,最后终于将问题解决。

现在坑已填平,为避免大家再受到类似问题的困扰,现在将整个过程及解决方案记录如下,供大家参考。

VFP远程访问oracle,我以前一般是通过安装oracle 9i精简版客户端,来作为访问的驱动程序,因为该精简版客户端大小仅十几兆,安装也非常方便。

仍按以前的套路,安装和配置好9i的客户端后,接着使用账套设置工具,进行测试连接,如下图,可以看到,测试成功。

然后,仍按以前的做法,开始编写代码进行测试:

ocon = NEWOBJECT(“qiyu_connection”,“qiyu超类”,“”,“test”)

ncon = ocon.createcon()

?‘ncon=’,ncon

但是,神奇的情况出现了,ncon竟然返回-1,也就是说,连接失败了。这些代码是以前多次写过的,不会有任何问题的,况且,在账套设置中,明明显示测试成功啊。

我有点糊涂了,到Con_set表中查看,可以看到无论是servername,Uid,还是Pwd,以及port等,都没有任何问题。

然后想到,VFP是通过ODBC来连接和访问oracle的,于是来到控制面板,注意,64位的系统有两个odbc,要使用32位的,如下图:

输入各项参数,测试连接,可以看到连接成功,这说明oracle的驱动程序是没有问题的,通过Oracle ODBC可以正常连接和访问oracle。


驱动程序没有问题,使用账套设置工具也能测试成功,到了使用代码测试就出现问题了,这不见鬼了?

此时,想到以前在猫老师公众号中的文章:免客户端安装配置VFP连接Oracle数据库,其实就是使用oracle的轻量级客户端instant client的方法,来连接和访问oracle,也就是说,用instant client来代替前面的oracle 9i精简版的客户端。

卸载oracle 9i,安装和配置instant cliet,注意,也需要32位版本,各项环境变量配置完成后,先到控制面板的ODBC中测试,和上面一样,ODBC返回Connection successful,说明instant client配置没有问题。

重新执行上面的代码:

ocon = NEWOBJECT(“qiyu_connection”,“qiyu超类”,“”,“test”)

ncon = ocon.createcon()

?‘ncon=’,ncon

结果,仍返回-1,这次是真的蒙了。

最后,到猫框中修改连接字符串,将原来的Driver={Microsoft ODBC for Oracle};server=改为Driver={Oracle in instantclient_12_2};dbq=,再次执行上述代码,总算是连接成功,ncon可以返回正数。

或者,按照猫老师的建议,不修改框架,先使用连接字符串自己创建句柄:

m.lcConn = “Driver={Oracle in instantclient_12_2};Dbq=;Uid=;Pwd=***;”

m.handle = SQLSTRINGCONNECT(m.lcConn)

然后将该句柄传入:

oDbHelper=NEWOBJECT(“MSSQLHelper”,“MSSQLHelper.prg”,“”,m.handle)

这种方式也可以使用(我没有测试)。

但是,这样做总感觉不爽,因为一是需要修改框架,而且,driver的字符串,会随安装的instant client版本的不同而发生变化,所以,还是感觉仍使用oracle 9i的精简客户端,这样通用性更强。

删除instant client的环境变量,回到oracle 9i,并再次狂翻各种帖子,终于找到了问题所在。

网上的说法是:运行连接Oracle的程序的目录名不能包含括号。而我这次安装VFP时,安装的目录是D:\Program Files (x86)\VFP9,问题真的是出在这里吗?

立马卸载掉VFP,重新安装到D:\Program Files\VFP9,所有代码全部没有变,继续测试,ncon的值变为正数,连接成功了!

此时真的有点阴沟里翻船的感觉,就是因为目录中包含括号的小问题,害的我忙活了好几天。

最后总结如下:VFP远程访问oracle,可以使用oracle 9i的精简客户端,也可以使用instant client,两者其实都是起到了访问驱动的作用。

但我个人仍喜欢使用9i客户端,因为安装后,可以自动配置(当然,tnsnames.ora需要自己配置好),不用象instant client,需要手动配置三个环境变量。

原网站

版权声明
本文为[加菲猫的VFP]所创,转载请带上原文链接,感谢
https://blog.csdn.net/fitche/article/details/125162076