温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Windows中怎么使用ADO远程访问PostgreSQL

发布时间:2021-08-05 17:43:31 来源:亿速云 阅读:272 作者:Leah 栏目:大数据

这篇文章将为大家详细讲解有关Windows中怎么使用ADO远程访问PostgreSQL,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

Windows使用odbc访问PostgreSQL

1.下载

postgresql相应的odbc驱动安装文件(32位或者64位),msi文件,网址:

http://www.postgresql.org/ftp/odbc/versions/msi/ 

next安装,安装目录为C:\Program Files (x86)\psqlODBC或者C:\Program Files\psqlODBC

2.配置

打开控制面板->管理工具->数据源(ODBC),如下:

Windows中怎么使用ADO远程访问PostgreSQL

根据系统进行相应的选择,其实32位和64位的ODBC数据源对应的是同一个可执行文件C:\Windows\System32\odbcad32.exe;打开,如下:

 Windows中怎么使用ADO远程访问PostgreSQL

可以’Test’按钮测试连接成功,连接成功说明可以在VS中使用;

 Windows中怎么使用ADO远程访问PostgreSQL

3.32位和64位的问题

虽然上面调用同一个odbcad32.exe文件,但配置结果是有区别的;

对应关系如下:

ODBC数据源(32位)->只能添加和编辑32位的ODBC驱动(PostgreSQL同理)->注册表“HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\PostgreSQL35W”下面的Drive对应的是32位的psqlodbc35w.dll文件->只能应用于VS上的win32程序;

64位映射关系同理,同时修改注册表或者数据源其中一个,例外一个也会随着更改,二者相对应;

同时注意,连接使用的Data Source是PostgreSQL 35W,这个Data Source的设置在VS的C++程序中会用到;

4.VS程序连接

程序代码在最后,此类方法使用ado连接,只是把数据源即Data Source改为ODBC对应的PostgreSQL35W;

VS使用ADO远程访问PostgreSQL

1.odbc不足

使用ODBC远程连接PostgreSQL对数据库的配置,例如IP,Port,User ID,PWD等都要在windows系统上进行配置,不能再程序中修改,不利于程序的迁移;

2.具体实现

实现如代码

出现的问题:

1.要使用ado操作数据库,引入代码如下

#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF", "adoEOF") 

编译器会提示:
intelliSense: 无法打开源文件 …/Debug/msado15.tlh
的错误,解决办法很简单
在 生成 菜单点击 重新生成 即可。
原因是:
当编译器遇到#import语句时,它会为引用组件类型库中的接口生成包装类,#import语句实际上相当于执行了API涵数LoadTypeLib()。#import语句会在工程可执行程序输出目录中产生两个文件,分别为*.tlh(类型库头文件)及*.tli(类型库实现文件),它们分别为每一个接口产生智能指针,并为各种接口方法、枚举类型,CLSID等进行声明,创建一系列包装方法。
在没有经过编译器编译之前,文件还没有生成。所以,会出现错误提示。

2.代码问题

在下面的程序中加***号的部分,如果添加上,关闭控制台或者终止程序后会出现下面的问题(有时候会出现也有时候不会),如下:

close():当一个对象被关闭,不会从内存中删除,资源部会释放。它有可能改变其设置,以后再打开它,可以在使用open函数打开使用。

release():释放对象所占资源,前提是m_pConnection和m_pRecordset所指向的资源后面不再用到(好像关闭程序或控制台会再销毁一次);

下面的解释还有问题:(望知道的大牛给点指点)

理解是:close()调用后,m_pRecordset指针不再指向结果集,故不能再release();

调用release()后,该指针不再存在,关闭程序或控制台仍要释放该指针,就会报错误;


代码:(安装上面配置后可以运行成功亲测,win32)

#include <iostream>
using namespace std;
#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF", "adoEOF") 
int main(){
::CoInitialize(NULL);
_ConnectionPtr m_pConnection;
HRESULT hr;
//使用ADO连接的数据配置
//_bstr_t strConnect = "Provider=PostgreSQL OLE DB Provider;Data Source=211.87.224.138;Location=shape;";
//使用ODBC连接的数据配置
_bstr_t strConnect = "Data Source=PostgreSQL35W";
try{
hr = m_pConnection.CreateInstance("ADODB.Connection");///创建Connection对象
if (SUCCEEDED(hr)){
hr = m_pConnection->Open(strConnect, "xhuyong", "123456", adModeUnknown);
if (m_pConnection->State)
cout << "数据库已连接!" << endl;
}
}catch (_com_error e) { //COM错误取得,当执行COM功能的时候,如果出错,可以捕捉到_com_error的异常
cout << "error message " << e.ErrorMessage() << endl;
}
/*********操作数据库表*********/
_RecordsetPtr m_pRecordset;
try{
hr = m_pRecordset.CreateInstance("ADODB.Recordset");
if (SUCCEEDED(hr)){
m_pRecordset->Open("SELECT * FROM object", _variant_t((IDispatch*)m_pConnection, true), adOpenStatic, adLockOptimistic, adCmdText);
while (!m_pRecordset->adoEOF){
cout << (_bstr_t)m_pRecordset->GetCollect("label") << "  " << (_bstr_t)m_pRecordset->GetCollect("describe") << endl;
m_pRecordset->MoveNext();
}
}
}catch (_com_error e){
cout << "读取数据库失败!\r\n错误信息: " << e.ErrorMessage() << endl;
}
//释放资源
if (m_pRecordset != NULL && m_pRecordset->GetState() == adStateOpen)
m_pRecordset->Close();
if (m_pConnection != NULL && m_pConnection->GetState() == adStateOpen)
m_pConnection->Close();
//m_pRecordset->Release();   ***
//m_pConnection->Release();   ***
//释放COM资源,否则会有内存泄露
//::CoUninitialize();   ***
 
cout << "hello world" << endl;
getchar();
return 0;
}

关于Windows中怎么使用ADO远程访问PostgreSQL就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI