ODBC(MFC)で SELECT(CSV形式で標準出力に表示) ▲TOP
CString strCon;
CString strSql;
//接続文字列生成
strCon = "DSN=dsn;UID=uid;PWD=pwd";
//実行SQL生成
strSql = "select * from kemp";
CDatabase db;
//接続
db.OpenEx( _T( strCon ), CDatabase::openReadOnly | CDatabase::noOdbcDialog );
//実行
CRecordset rs( &db );rs.Open( CRecordset::forwardOnly, _T( strSql ) );
CString strResult;
CODBCFieldInfo fi;
short nFields = rs.GetODBCFieldCount();
short index;
//取得結果をCSV形式で表示
if (!rs.IsEOF()) {
strResult = "";
for(index = 0; index < nFields; index++ ) {
rs.GetODBCFieldInfo(index, fi);
strResult = strResult + fi.m_strName + ",";
}
cout << (LPCTSTR)strResult << endl;
}
CString strValue;
while( !rs.IsEOF() )
{
strResult = "";
for(index = 0; index < nFields; index++ ) {
rs.GetFieldValue( index, _T( strValue ) );
strResult = strResult + strValue + ",";
}
cout << (LPCTSTR)strResult << endl;
rs.MoveNext();
}
rs.Close();
db.Close();
ODBC(API)で SELECT(CSV形式で標準出力に表示) ▲TOP
//cl /EHsc test_odbcapi.cpp /link Odbc32.Lib
//※Visual C++ Toolkit 2003 で久々にリコンパイルしたらキャストのエラーがしこたま出たので修正
//
// include files
//
#include <Windows.h>
#include <sql.h>
#include <sqlext.h>
#include <sqltypes.h>
#include <stdio.h>
//
// function prototypes
//
int main();
//
// main
//
int main()
{
SQLHENV henv;
SQLHDBC hdbc;
SQLHSTMT hstmt;
SQLRETURN sqlrc;
char sql[1025];
char svalue[2049];
SQLINTEGER inum;
SQLSMALLINT cols;
int i;
char uid[24];
char pwd[24];
char dsn[24];
//接続文字列生成
strcpy(uid, "uid");
strcpy(pwd, "pwd");
strcpy(dsn, "dsn");
//実行SQL生成
strcpy(sql, "select * from kemp");
//環境ハンドル
sqlrc = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
if (sqlrc != SQL_SUCCESS && sqlrc != SQL_SUCCESS_WITH_INFO) {
printf("SQLAllocHandle SQL_HANDLE_ENV Error\n");
return 9;
}
//環境属性の設定
sqlrc = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void *)SQL_OV_ODBC3, 0);
if (sqlrc != SQL_SUCCESS && sqlrc != SQL_SUCCESS_WITH_INFO) {
printf("SQLSetEnvAttr Error\n");
return 9;
}
//接続ハンドル
sqlrc = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
if (sqlrc != SQL_SUCCESS && sqlrc != SQL_SUCCESS_WITH_INFO) {
printf("SQLAllocHandle SQL_HANDLE_DBC Error\n");
return 9;
}
//接続
sqlrc = SQLConnect(hdbc, (SQLCHAR*)dsn, SQL_NTS, (SQLCHAR*)uid, SQL_NTS, (SQLCHAR*)pwd, SQL_NTS);
if (sqlrc != SQL_SUCCESS && sqlrc != SQL_SUCCESS_WITH_INFO) {
printf("SQLConnect Error\n");
return 9;
}
//ステートメントハンドル
sqlrc = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
if (sqlrc != SQL_SUCCESS && sqlrc != SQL_SUCCESS_WITH_INFO) {
printf("SQLAllocHandle SQL_HANDLE_STMT Error\n");
return 9;
}
//ステートメントの準備
sqlrc = SQLPrepare(hstmt, (SQLCHAR*)sql, SQL_NTS);
if (sqlrc != SQL_SUCCESS && sqlrc != SQL_SUCCESS_WITH_INFO) {
printf("SQLPrepare Error\n");
return 9;
}
//列数の取得
sqlrc = SQLNumResultCols(hstmt, &cols);
if (sqlrc != SQL_SUCCESS && sqlrc != SQL_SUCCESS_WITH_INFO) {
printf("SQLNumResultCols Error\n");
return 9;
}
//実行
sqlrc = SQLExecDirect(hstmt, (SQLCHAR*)sql, SQL_NTS);
//取得結果をCSV形式で表示
while (TRUE) {
sqlrc = SQLFetch(hstmt);
if (sqlrc == SQL_SUCCESS || sqlrc == SQL_SUCCESS_WITH_INFO) {
for (i = 1; i < cols+1; i++) {
if (i > 1) {printf(",");}
strcpy(svalue, "");
SQLGetData(hstmt, i, SQL_C_CHAR, (SQLCHAR*)svalue, 2048, &inum);
printf(svalue);
}
printf("\n");
} else {
if (sqlrc == SQL_NO_DATA) {
printf("\n");
} else {
//その他のエラー
printf("SQLFetch ERROR\n");
}
break;
}
}
}
ADO で SELECT(CSV形式で標準出力に表示) ▲TOP
//cl /EHsc test_ado.cpp
//※Visual C++ Toolkit 2003 で試したところ、何か遅い気が…。
//
// import dll
//
#import "C:\Program files\Common Files\System\Ado\msado15.dll" no_namespace rename("EOF", "ADOEOF")
//
// include files
//
#include "stdio.h"
#include "io.h"
//
// function prototypes
//
int main();
//
// main
//
int main()
{
HRESULT hr;
CoInitialize(NULL);
try {
_ConnectionPtr pConn;
_RecordsetPtr pRs;
hr = pConn.CreateInstance(__uuidof(Connection));
hr = pRs.CreateInstance(__uuidof(Recordset));
//接続
pConn->CursorLocation = adUseClient;
_bstr_t strConn("Provider=sqloledb;Data Source=localhost;Initial Catalog=misc;User Id=uid;Password=pwd;");
hr = pConn->Open(strConn, "", "", adConnectUnspecified);
//実行
hr = pRs->Open("select * from kemp", pConn.GetInterfacePtr(), adOpenForwardOnly, adLockReadOnly, adCmdText);
_variant_t vtColumn;
_variant_t vtNull;
vtNull.ChangeType(VT_NULL);
TCHAR strDisp[MAX_PATH+1];
short i = 0;
short fc = pRs->Fields->Count;
//取得結果をCSV形式で表示
for (i=0; i< fc; i++)
{
vtColumn = pRs->Fields->GetItem(i)->Name;
vtColumn.ChangeType(VT_BSTR);
lstrcpyn( strDisp, (_bstr_t)vtColumn, MAX_PATH );
if (i == fc-1) {
printf("%s\n", strDisp);
} else {
printf("%s,", strDisp);
}
}
pRs->MoveFirst();
if( !pRs->ADOEOF ){
while ( !pRs->ADOEOF ){
for (i=0; i< fc; i++)
{
vtColumn = pRs->GetCollect(i);
if (vtColumn == vtNull) {
vtColumn = _variant_t("");
} else {
vtColumn.ChangeType(VT_BSTR);
}
lstrcpyn( strDisp, (_bstr_t)vtColumn, MAX_PATH );
if (i == fc-1) {
printf("%s\n", (LPCSTR)strDisp);
} else {
printf("%s,", (LPCSTR)strDisp);
}
}
pRs->MoveNext();
}
}
hr = pRs->Close();
} catch(_com_error &e) {
_bstr_t bstrSource(e.Source());
_bstr_t bstrDescription(e.Description());
printf("Error:%s\n", (LPCSTR) bstrDescription);
}
}
oo4o で ストアドプロシージャのOUTパラメータ(カーソル変数)取得 ▲TOP
OSession osess;
ODatabase odb;
OParameterCollection params;
OParameter ocur;
ODynaset odyn;
char cempnm[30];
//初期化
OStartup();
//セッション
osess.Open();
odb.Open(osess, "dsn", "uid", "pwd");
//カーソル変数取得例
//※カーソル変数がファンクションの戻り値である場合でも、
// アウトパラメータとして定義する点に注意。
params = odb.GetParameters();
params.Add("CUR1", 0, OPARAMETER_OUTVAR, OTYPE_CURSOR);
//無名PL/SQLブロック実行(カーソル変数取得
odb.ExecuteSQL("begin pkg_cur.prc_getcur(:CUR1); end;");
//※カーソル変数がファンクションの戻り値である場合
//odb.ExecuteSQL("begin :CUR1 := fnc_getcur; end;");
ocur = params.GetParameter("CUR1");
//取得したカーソル変数でダイナセットをオープンする
//ここは実装時には肝要な部分だと思うんだけど、マニュアルには書いてないようだ
ocur.GetValue(&odyn);
//後は通常のダイナセットの操作と同じ
odyn.GetFieldValue("empnm", cempnm, 30);
printf(cempnm);
//後処理
odyn.Close();
odb.Close();
osess.Close();
OShutdown();