Windows上VS使用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 SourcePostgreSQL 35W,這個Data Source的設置在VSC++程序中會用到;

 

4.VS程序連接

程序代碼在最後,此類方法使用ado連接,只是把數據源即Data Source改爲ODBC對應的PostgreSQL35W

 

VS使用ADO遠程訪問PostgreSQL

1.odbc不足

使用ODBC遠程連接PostgreSQL對數據庫的配置,例如IPPortUser IDPWD等都要在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_pConnectionm_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;
}


具體的ADO的操作可以參考博客http://www.cppblog.com/changshoumeng/articles/113437.html,很詳細的


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章