WindowsでVS ADOを使用してPostgreSQLにリモートアクセス


Windows odbcを使用してPostgreSQLにアクセス
1.ダウンロード
postgresql対応odbcドライバインストールファイル(32ビットまたは64ビット)、msiファイル、URL:
http://www.postgresql.org/ftp/odbc/versions/msi/ 
nextインストール、インストールディレクトリC:Program Files(x 86)psqlODBCまたはC:Program FilespsqlODBC
2.構成
コントロールパネル->管理ツール->データソース(ODBC)を次のように開きます.
Windows上VS使用ADO远程访问PostgreSQL_第1张图片
システムの選択により、32ビットと64ビットのODBCデータソースは同じ実行可能ファイルC:WindowsSystem 32odbcad 32に対応する.exe;次のように開きます.
 
可'Test'ボタンは接続が成功したことをテストし、接続成功説明はVSで使用できる.
 
3.32ビットと64ビットの問題
同じodbcad 32が呼び出されたが.exeファイルですが、構成結果には違いがあります.
対応関係は次のとおりです.
ODBCデータソース(32ビット)->32ビットのODBCドライバ(PostgreSQL同理)->レジストリ"HKEY_CURRENT_USERSoftwareODBCODBC.INIPostgreSQL 35 W"の下のDriveは32ビットのpsqlodbc 35 wに対応する.dllファイル->VSにしか適用できないwin 32プログラム;
64ビットマッピング関係は同じで、レジストリまたはデータソースのいずれかを変更し、例外の1つも変更され、両方が対応します.
また、接続に使用するData SourceはPostgreSQL 35 Wであり、このData Sourceの設定はVSのC++プログラムで使用される.
 
4.VSプログラム接続
プログラムコードは最後にado接続を用い,データソースであるData SourceをODBC対応のPostgreSQL 35 Wに変更する.
 
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/msado 15.tlhのエラーは、簡単に生成メニューをクリックして再生成すればよい.なぜなら、コンパイラが#import文に遭遇すると、参照コンポーネントタイプライブラリのインタフェースにパッケージクラスが生成され、#import文は実際にはAPI涵数LoadTypeLib()を実行したことに相当するからです.import文は、プロジェクト実行可能プログラム出力ディレクトリに*という2つのファイルを生成する.tlh(タイプライブラリヘッダファイル)および*tli(タイプライブラリ実装ファイル)は、各インタフェースにスマートポインタを生成し、様々なインタフェースメソッド、列挙タイプ、CLSIDなどを宣言し、一連のパッケージメソッドを作成します.コンパイラによってコンパイルされるまで、ファイルは生成されませんでした.エラーメッセージが表示されます.
2.コードの問題
次のプログラムに***番号を付けた部分を追加すると、コンソールを閉じるか、プログラムを終了すると次のような問題が発生します(発生する場合もありません).
 
close():オブジェクトが閉じられ、メモリから削除されない場合、リソース部は解放されます.設定を変更して後で開く可能性があり、open関数を使用して開くことができます.
release():m_pConnectionとm_pRecordsetが指すリソースの後には使用されません(プログラムまたはコンソールを閉じると再破棄されるようです).
 
次の解釈には問題があります.(知っている牛に教えてほしい)
close()呼び出し後、m_pRecordsetポインタは結果セットを指さないのでrelease()は使用できません.
release()を呼び出すと、ポインタは存在せず、プログラムまたはコンソールを閉じてもポインタを解放しようとすると、エラーが表示されます.
コード:(上の構成をインストールすると、親測定に成功します.win 32)
#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
: " << 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ああ、詳しい