您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關(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),如下:
根據(jù)系統(tǒng)進行相應(yīng)的選擇,其實32位和64位的ODBC數(shù)據(jù)源對應(yīng)的是同一個可執(zhí)行文件C:\Windows\System32\odbcad32.exe;打開,如下:
可以’Test’按鈕測試連接成功,連接成功說明可以在VS中使用;
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é)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責(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)容。