○SQLコンソールみたいなものを作る
コマンドラインで実行すると下のようにSQL文が操作できます


ODBCデータソース名:testodbcdriver
ユーザー名:sa
パスワード:
>select * from table1

-------------------------------
a       b
-------------------------------
3       <NULL>
4       inaba
5       test
-------------------------------
>


▼ココから下がソースコード


#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include <sql.h>
#include <sqlext.h>

//-----------------------------------------
//ODBC 接続
//-----------------------------------------
bool Connect(char*server,char*uid,char*pwd,HENV*henv, HDBC*hdbc,HSTMT*hstmt){
	SQLAllocEnv(henv);//環境ハンドルの割り当て
	SQLAllocConnect(*henv, hdbc);//接続ハンドルの割り当て
	//データ・ソースへの接続
	RETCODE rc = SQLConnect(*hdbc, (unsigned char*)server, SQL_NTS, (unsigned char*)uid, SQL_NTS, (unsigned char*)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,char*SQLStr){
	//ステートメントの直接の実行
	RETCODE rc = SQLExecDirect(*hstmt,(unsigned char*)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 ステートメント・ハンドル

	char datasouce[128]="";
	char username[128]="";
	char pasword[128]="";

	printf("ODBCデータソース名:");
	gets(datasouce);

	printf("ユーザー名:");
	gets(username);

	printf("パスワード:");
	gets(pasword);

	//接続 ODBCデータソース名 ユーザー名 パスワード
	if(!Connect(datasouce,username,pasword,&henv,&hdbc,&hstmt)){
		printf("接続エラー\n");
		return 1;
	}
	//========================================================
	while(1){
		printf(">");
		char buf[1024]="";
		gets(buf);
		if(!strcmp(buf,"quit")){ printf("\n%s\n","END");break;}

		//結果を返すSQL文の実行
		if(Execute(&henv,&hdbc,&hstmt,buf)){
			//カラムの数を求める
			short cols=0;
			SQLNumResultCols(hstmt, &cols);

			if(cols!=0){
				printf("\n-------------------------------\n");
				//カラムの名前を表示
				{for(int i=1;i<=(int)cols;i++){
					unsigned char str[128];
					SQLDescribeCol(hstmt,i, str,sizeof(str),NULL,NULL,NULL,NULL,NULL);
					printf("%s\t",str);
				}}

				//printf("列の数 %d\n",cols);
				unsigned char  str[256][1024];//フィールド最大サイズ
				long le[256];//NULLの判定 -1が来たらNULL
				for(int i=1;i<=(int)cols;i++){
				//アプリケーション変数への列のバインド(変数に関連付け)
					SQLBindCol(hstmt, i, SQL_C_CHAR, &str[i], (SDWORD)sizeof(str),&le[i]);
				}
				printf("\n-------------------------------");
				while(1){
					for(int j=1;i<=(int)cols;j++) str[j][0]=0;
					RETCODE rc = SQLFetch(hstmt);

					if( rc == SQL_NO_DATA_FOUND ) break;
					if( rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO ) {
						printf("ERR");
					}
					printf("\n");
					for(int i=1;i<=(int)cols;i++){
						if(le[i]!=SQL_NULL_DATA){ //NULLの判定
							printf("%s\t",str[i]);
						}else{
							printf("%s\t","<NULL>");
						}
					}
					if(_kbhit()){
						//ESCキーが押されたため表示を中止する
						if(0x1B==getch()){
							printf("\n\n----ESCキーにより画面表示が中止されました----");
							break;
						}
					}
				}
				printf("\n-------------------------------\n");
				SQLFreeStmt(hstmt, SQL_DROP);//ステートメント・ハンドルの解放
				SQLAllocStmt(hdbc, &hstmt);//ステートメント・ハンドルの再割り当て
				//========================================================
			}else{
				printf("OK\n");
			}
		}else{
			printf("ERR\n");
		}
	}
	//切断
	Close(&henv,&hdbc,&hstmt);
	//========================================================

	return 0;
}




▲トップページ > Windows と C++