○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++