○ODBC
ODBC API 2.0 です
実行すると、テーブルを作成して、レコードを追加して、レコードを出力し、テーブルを削除します
コントロールパネルからODBCデータソースを以下のように作成しました
ODBCデータソース名 : testODBCDriver
ユーザー名 : sa
パスワード : なし
#include <stdio.h>
#include <windows.h>
#include <sql.h>
#include <sqlext.h>
//-----------------------------------------
//ODBC 接続
//-----------------------------------------
bool Connect(TCHAR*server,TCHAR*uid,TCHAR*pwd,HENV*henv, HDBC*hdbc,HSTMT*hstmt){
SQLAllocEnv(henv);//環境ハンドルの割り当て
SQLAllocConnect(*henv, hdbc);//接続ハンドルの割り当て
//データ・ソースへの接続
RETCODE rc = SQLConnect(*hdbc,(SQLTCHAR*)server,SQL_NTS,(SQLTCHAR*)uid,SQL_NTS,(SQLTCHAR*)pwd, SQL_NTS);
if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {
return false;
}
SQLAllocStmt(*hdbc, hstmt);//ステートメント・ハンドルの割り当て
return true;
}
//-----------------------------------------
//ODBC 切断
//-----------------------------------------
void Close(HENV*henv, HDBC*hdbc,HSTMT*hstmt){
SQLFreeStmt(hstmt, SQL_DROP);//ステートメント・ハンドルの解放
SQLDisconnect(*hdbc);//データ・ソースからの切断
SQLFreeConnect(*hdbc);// 接続ハンドルの解放
SQLFreeEnv(*henv);//環境ハンドルの解放
}
//-----------------------------------------
//ODBC SQLの実行
//-----------------------------------------
bool Execute(HENV*henv, HDBC*hdbc, HSTMT*hstmt,TCHAR*SQLStr){
//ステートメントの直接の実行
RETCODE rc = SQLExecDirect(*hstmt,(SQLTCHAR*)SQLStr, SQL_NTS);
if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {
return false;
}
return true;
}
int main() {
HENV henv;//ODBC 環境ハンドル
HDBC hdbc;//ODBC 接続ハンドル
HSTMT hstmt;//ODBC ステートメント・ハンドル
//接続 ODBCデータソース名 ユーザー名 パスワード
if(!Connect(TEXT("testODBCDriver"),TEXT("sa"),TEXT(""),&henv,&hdbc,&hstmt)){
printf("接続エラー\n");
return 1;
}
//========================================================
//結果を返さないSQL文の実行 テーブルの作成
Execute(&henv,&hdbc,&hstmt,TEXT("CREATE TABLE table1(intval INT,realval REAL,strval CHAR(10))"));
//========================================================
//トランザクションの開始 自動コミットをOFFにする
SQLSetConnectOption( hdbc, SQL_AUTOCOMMIT, SQL_AUTOCOMMIT_OFF );
//========================================================
//結果を返さないSQL文の実行 値の追加
Execute(&henv,&hdbc,&hstmt,TEXT("INSERT INTO table1(intval,realval,strval) VALUES(100,4.444,'test')"));
//========================================================
//トランザクションの終了
SQLTransact( henv, hdbc, SQL_COMMIT );
//SQLTransact( henv, hdbc, SQL_ROLLBACK );
SQLSetConnectOption( hdbc, SQL_AUTOCOMMIT, SQL_AUTOCOMMIT_ON ); //自動コミットをONにする
//========================================================
//結果を返すSQL文の実行
Execute(&henv,&hdbc,&hstmt,TEXT("SELECT intval,realval,strval FROM table1"));
//カラムの数を求める
//short cols;
//SQLNumResultCols(hstmt, &cols);
//printf("列の数 %d\n",cols);
//アプリケーション変数への列のバインド(変数に関連付け)
DWORD intval;
double realval;
unsigned char str[11];
SQLBindCol(hstmt, 1, SQL_C_SLONG, &intval, (SDWORD)sizeof(intval), NULL);
SQLBindCol(hstmt, 2, SQL_C_DOUBLE , &realval, (SDWORD)sizeof(realval), NULL);
SQLBindCol(hstmt, 3, SQL_C_TCHAR, &str, (SDWORD)sizeof(str),NULL);
while(1){
RETCODE rc = SQLFetch(hstmt);
if( rc == SQL_NO_DATA_FOUND )
break;
if( rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO ) {
printf("ERR\n");
break;
}
printf( "%d %g %s\n",intval,realval,str);
}
SQLFreeStmt(hstmt, SQL_DROP);//ステートメント・ハンドルの解放
SQLAllocStmt(hdbc, &hstmt);//ステートメント・ハンドルの再割り当て
//========================================================
//結果を返さないSQL文の実行 テーブルの削除
Execute(&henv,&hdbc,&hstmt,TEXT("DROP TABLE table1"));
//========================================================
//切断
Close(&henv,&hdbc,&hstmt);
//========================================================
printf("END\n");
getchar();
return 0;
}
▲トップページ
>
Windows と C++