WindowsでVS ADOを使用してPostgreSQLにリモートアクセス
4717 ワード
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)を次のように開きます.
システムの選択により、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)
具体的なADOの操作はブログを参考にすることができますhttp://www.cppblog.com/changshoumeng/articles/113437.htmlああ、詳しい
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)を次のように開きます.
システムの選択により、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ああ、詳しい