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