溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Windows中怎么使用ADO遠程訪問PostgreSQL

發(fā)布時間:2021-08-05 17:43:31 來源:億速云 閱讀:263 作者:Leah 欄目:大數(shù)據(jù)

這篇文章將為大家詳細講解有關(guān)Windows中怎么使用ADO遠程訪問PostgreSQL,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

Windows使用odbc訪問PostgreSQL

1.下載

postgresql相應(yīng)的odbc驅(qū)動安裝文件(32位或者64位),msi文件,網(wǎng)址:

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

next安裝,安裝目錄為C:\Program Files (x86)\psqlODBC或者C:\Program Files\psqlODBC

2.配置

打開控制面板->管理工具->數(shù)據(jù)源(ODBC),如下:

Windows中怎么使用ADO遠程訪問PostgreSQL

根據(jù)系統(tǒng)進行相應(yīng)的選擇,其實32位和64位的ODBC數(shù)據(jù)源對應(yīng)的是同一個可執(zhí)行文件C:\Windows\System32\odbcad32.exe;打開,如下:

 Windows中怎么使用ADO遠程訪問PostgreSQL

可以’Test’按鈕測試連接成功,連接成功說明可以在VS中使用;

 Windows中怎么使用ADO遠程訪問PostgreSQL

3.32位和64位的問題

雖然上面調(diào)用同一個odbcad32.exe文件,但配置結(jié)果是有區(qū)別的;

對應(yīng)關(guān)系如下:

ODBC數(shù)據(jù)源(32位)->只能添加和編輯32位的ODBC驅(qū)動(PostgreSQL同理)->注冊表“HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\PostgreSQL35W”下面的Drive對應(yīng)的是32位的psqlodbc35w.dll文件->只能應(yīng)用于VS上的win32程序;

64位映射關(guān)系同理,同時修改注冊表或者數(shù)據(jù)源其中一個,例外一個也會隨著更改,二者相對應(yīng);

同時注意,連接使用的Data Source是PostgreSQL 35W,這個Data Source的設(shè)置在VS的C++程序中會用到;

4.VS程序連接

程序代碼在最后,此類方法使用ado連接,只是把數(shù)據(jù)源即Data Source改為ODBC對應(yīng)的PostgreSQL35W;

VS使用ADO遠程訪問PostgreSQL

1.odbc不足

使用ODBC遠程連接PostgreSQL對數(shù)據(jù)庫的配置,例如IP,Port,User ID,PWD等都要在windows系統(tǒng)上進行配置,不能再程序中修改,不利于程序的遷移;

2.具體實現(xiàn)

實現(xiàn)如代碼

出現(xiàn)的問題:

1.要使用ado操作數(shù)據(jù)庫,引入代碼如下

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

編譯器會提示:
intelliSense: 無法打開源文件 …/Debug/msado15.tlh
的錯誤,解決辦法很簡單
在 生成 菜單點擊 重新生成 即可。
原因是:
當編譯器遇到#import語句時,它會為引用組件類型庫中的接口生成包裝類,#import語句實際上相當于執(zhí)行了API涵數(shù)LoadTypeLib()。#import語句會在工程可執(zhí)行程序輸出目錄中產(chǎn)生兩個文件,分別為*.tlh(類型庫頭文件)及*.tli(類型庫實現(xiàn)文件),它們分別為每一個接口產(chǎn)生智能指針,并為各種接口方法、枚舉類型,CLSID等進行聲明,創(chuàng)建一系列包裝方法。
在沒有經(jīng)過編譯器編譯之前,文件還沒有生成。所以,會出現(xiàn)錯誤提示。

2.代碼問題

在下面的程序中加***號的部分,如果添加上,關(guān)閉控制臺或者終止程序后會出現(xiàn)下面的問題(有時候會出現(xiàn)也有時候不會),如下:

close():當一個對象被關(guān)閉,不會從內(nèi)存中刪除,資源部會釋放。它有可能改變其設(shè)置,以后再打開它,可以在使用open函數(shù)打開使用。

release():釋放對象所占資源,前提是m_pConnection和m_pRecordset所指向的資源后面不再用到(好像關(guān)閉程序或控制臺會再銷毀一次);

下面的解釋還有問題:(望知道的大牛給點指點)

理解是:close()調(diào)用后,m_pRecordset指針不再指向結(jié)果集,故不能再release();

調(diào)用release()后,該指針不再存在,關(guān)閉程序或控制臺仍要釋放該指針,就會報錯誤;


代碼:(安裝上面配置后可以運行成功親測,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連接的數(shù)據(jù)配置
//_bstr_t strConnect = "Provider=PostgreSQL OLE DB Provider;Data Source=211.87.224.138;Location=shape;";
//使用ODBC連接的數(shù)據(jù)配置
_bstr_t strConnect = "Data Source=PostgreSQL35W";
try{
hr = m_pConnection.CreateInstance("ADODB.Connection");///創(chuàng)建Connection對象
if (SUCCEEDED(hr)){
hr = m_pConnection->Open(strConnect, "xhuyong", "123456", adModeUnknown);
if (m_pConnection->State)
cout << "數(shù)據(jù)庫已連接!" << endl;
}
}catch (_com_error e) { //COM錯誤取得,當執(zhí)行COM功能的時候,如果出錯,可以捕捉到_com_error的異常
cout << "error message " << e.ErrorMessage() << endl;
}
/*********操作數(shù)據(jù)庫表*********/
_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 << "讀取數(shù)據(jù)庫失敗!\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資源,否則會有內(nèi)存泄露
//::CoUninitialize();   ***
 
cout << "hello world" << endl;
getchar();
return 0;
}

關(guān)于Windows中怎么使用ADO遠程訪問PostgreSQL就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI