64位程序,利用ADO连接Oracle数据库

 
 

刚好手头项目解决了ADO连接Oracle数据库的问题,记录下来,防止忘记。

项目情况:用32位环境完成算法动态库,结果后来需要升级到64位环境,由64位的软件来调用,则在64位设置下生成算法动态库,发现数据库连接失败。数据库使用的是Oracle10,而连接技术使用的是比较熟悉的ADO。

1.首先怀疑的是ADO预编译所引用的msado15.dll版本问题,找来了64位msado15.dll,一样重现问题。

2.怀疑是连接语句依靠的\network\admin\tnsnames.ora文件不对,所以在程序中写死IP和端口,仍然重现问题。

其间忙于其他项目,只有用32位代替跑着,将其磕置。结果意外发现了64位在两位同事的电脑上能顺利运行,但在有些电脑上又出问题。所以确定为系统环境的问题,最终定位到ODAC。

 

问题最后解决了,但是还是未能完全脱离配置

1.连接语句写成这样,避免依赖tnsnames.ora文件

Provider=OraOLEDB.Oracle.1;Password=密码;Persist Security Info=True;User ID=用户名;\
Data Source=\"(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = IP)(PORT = 1521)) )(CONNECT_DATA = (SID = 数据库)))\"

其中可以将用户名、密码、数据库ID、IP、端口这些提出来写成配置文件,方便更改。

2.安装对应的ODAC,64位的下载地址http://www.oracle.com/technetwork/database/windows/downloads/index-090165.html。相对来说,32位的ODAC是EXE安装文件,简单粗暴,直接自动安装好一切,所以当时没有出问题。64位的ODAC驱动是由Oracle官方提供的XCOPY版本,安装过程参考微软官方http://support2.microsoft.com/kb/2831123/zh-tw

(1)解压XCOPY

(2)用命令行CD到(1)的目录下

(3)命令行运行其中的install.bat文件:install.bat all c:\oracle\ODAC_64 odac

(4)C盘出现目录c:\oracle\ODAC_64,进行系统环境配置:path里面增加C:\oracle\ODAC_64和C:\oracle\ODAC_64\bin

(5)完成

 

最后,这样的配置在一台机器上出现了报错的问题,发现是由于该机器上安装的东西过多,path环境混乱,Oracle版本指向不明,所以将C:\oracle\ODAC_64和C:\oracle\ODAC_64\bin这个路径放到path属性的最前面即可。

展开阅读全文

水晶报表ADO连接Oracle数据库 的问题

12-30

使用的是水晶报表10.0rnVC6.0开发.rnrn我看了一个水晶报表的手动连数据库的例子.rnrn代码是这样写的:rnrnDim m_Report As New CrystalReport1rnrn' The ADO connection to the local database.rnDim cnn1 As ADODB.ConnectionrnDim datcmd1 As ADODB.Commandrnrn' *************************************************************rn' Demonstrate the use of AddADOCommand by opening an ADO data command,rn' adding the data source to the report, and then adding a fieldrn' to the report that uses that data source.rn'rnPrivate Sub cmdADO_Click()rn Dim fld As FieldObjectrn Dim strCnn As Stringrn rn ' Open the data connectionrn Set cnn1 = New ADODB.Connectionrn strCnn = "Provider=MSDASQL;Persist Security Info=False;Data Source=Xtreme Sample Database 9;Mode=Read"rn cnn1.Open strCnnrnrn ' Create a new instance of an ADO command objectrn Set datcmd1 = New ADODB.Commandrn Set datcmd1.ActiveConnection = cnn1rn datcmd1.CommandText = "Customer"rn datcmd1.CommandType = adCmdTablernrn ' Add the datasource to the reportrn m_Report.Database.AddADOCommand cnn1, datcmd1rn ' Add a new field object to the report and set the field object to usern ' the new data source.rn Set fld = m_Report.Section3.AddFieldObject("ado.Customer Name", 0, 0)rn LoadReportrnEnd Subrnrnrn于是我也写了一个这样的VC代码:rnrn try rn m_CRViewer1.Create(NULL, "rptviewer", WS_CHILD, CRect(0,0,140,150), param, ID_THISREPORT, NULL);rn m_Report =m_Application->OpenReport (filename);rn rn m_pConnection.CreateInstance(__uuidof(Connection)); //初始化Connection指针rn m_pRecordset.CreateInstance(__uuidof(Recordset));//初始化Recordset指针rn rn rn m_pConnection->Open("Provider=MSDAORA;Data Source=test;User ID=cdjj; Password=cdjj","","",0);rn rn m_pCommand.CreateInstance(__uuidof(Command));rn m_pCommand->CommandType=adCmdTable;rn m_pCommand->CommandText="Customer";rn m_pCommand->ActiveConnection = m_pConnection; // 将库连接赋于它rn rn //CComVariantrn CComVariant pConnection(m_pConnection);rn CComVariant pCommand(m_pCommand);rnrn m_Report->Database->AddADOCommand(pConnection,pCommand);rn rn //rn m_Report->Database ->Tables ->Item [1]->SetLogOnInfo("test","test","cdjj","cdjj"); rn m_Report->Database->AddOLEDBSource(_bstr_t("Provider=MSDAORA;Data Source=test;User ID=cdjj; Password=cdjj"),_bstr_t("T_REALTIME_GATEWAY"));rn m_CRViewer1.SetDisplayBorder (FALSE);rn m_CRViewer1.SetEnableExportButton(TRUE);rn rn //与使用的控件联系rn m_CRViewer1.SetReportSource(m_Report);rn c.Restore();rn rn catch (_com_error& e) rn HandleError(e);rn rnrnrn但是运行到:rnrnm_Report->Database->AddADOCommand(pConnection,pCommand);rnrn的时候,会出一个异常,rnrnrne的值为:"0x80020005 类型不匹配" 论坛

没有更多推荐了,返回首页