这篇文章将为大家详细讲解有关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),如下:
根据系统进行相应的选择,其实32位和64位的ODBC数据源对应的是同一个可执行文件C:\Windows\System32\odbcad32.exe;打开,如下:
可以’Test’按钮测试连接成功,连接成功说明可以在VS中使用;
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就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。