ODBC を用いて MySQL の利用 のデータベースを操作する簡単なプログラム例
MySQL コマンドラインプログラムでの実行例
プログラムの実行結果例
MySQL コマンドラインクライアントと同様の結果が出ていることを確認できた.
プログラムのソースコード
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<windows.h> #include<iostream> #include<sql.h> #include<sqlext.h> using namespace std; #define SQL_BUFF_MAX 1024 #define SQL_CONDITION_MAX 512 RETCODE GetSqlError(HENV henv, HDBC hdbc, HSTMT hstmt, RETCODE rc, //In SQLCHAR szSqlState[6], SQLCHAR szErrorMsg[256]); //Out //int opendatabase(HENV *henv, HDBC *hdbc, char connect_str[]); int opendatabase(HENV *henv, HDBC *hdbc, HSTMT *hstmt,char datasouce[],char username[],char pasword[]); int closedatabase(HENV *henv, HDBC *hdbc); void command_select(HENV henv, HDBC hdbc,HSTMT hstmt); void err(HENV henv,HDBC hdbc,HSTMT hstmt); void main(){ RETCODE ret; HENV henv; //環境ハンドル HDBC hdbc; //接続ハンドル HSTMT hstmt; //ステートメントハンドル /*char connect_str[SQL_CONDITION_MAX]; sprintf(connect_str, "DSN=testdb;UID=testuser;PWD=aihara06"); //sprintf(connect_str, "DSN=MySQL testdb;UID=testuser;PWD=aihara06"); */ char datasouce[128] = ""; char username[128] = ""; char pasword[128] = ""; char str[128] = ""; printf("DBへの接続\n"); printf("ODBCデータベース:"); //scanf("%c",&datasouce); gets(datasouce); printf("ユーザー:"); //scanf("%c",&username); gets(username); printf("パスワード:"); //scanf("%c",&pasword); gets(pasword); // データベースを開く //ret = opendatabase(&henv, &hdbc, connect_str); ret = opendatabase(&henv, &hdbc, &hstmt,datasouce,username,pasword); if(ret == 0){ printf("SUCCESS OPEN\n"); }else{ printf("ERROR OPEN\n"); return; } while(1){ printf("コマンド:"); gets(str); if(strcmp(str,"select")==0)command_select(henv,hdbc,hstmt); if(strcmp(str,"exit")==0)break; } // データベースを閉じる ret = closedatabase(&henv, &hdbc); if (ret == 0){ printf("SUCCESS CLOSE\n"); }else{ printf("ERROR CLOSE\n"); return; } return; } //int opendatabase(HENV *henv, HDBC *hdbc, char connect_str[]){ int opendatabase(HENV *henv, HDBC *hdbc,HSTMT *hstmt ,char datasouce[],char username[],char pasword[]){ printf("--- OpenDataBase ---\n"); // RETCODE rc; // //char ret_connect_str[SQL_MAX_OPTION_STRING_LENGTH]; //SWORD ret_len; //環境ハンドルを割り振る rc = SQLAllocEnv(henv); printf("SQLAllocEnv --> %d\n", rc); if(rc != 0){return -1;} //接続ハンドルを割り振る rc = SQLAllocConnect(*henv, hdbc); printf("SQLAllocConnect --> %d\n", rc); if(rc != 0){return -1;} //データ・ソースに(拡張)接続する /*rc = SQLDriverConnect( *hdbc, 0, (unsigned char *)connect_str, SQL_NTS, (unsigned char *)ret_connect_str, (SWORD)sizeof( ret_connect_str ), &ret_len, SQL_DRIVER_NOPROMPT );*/ rc = SQLConnect(*hdbc, (unsigned char *)datasouce, SQL_NTS, (unsigned char *)username, SQL_NTS, (unsigned char *)pasword, SQL_NTS ); printf("SQLConnect --> %d\n", rc); if(rc == 0){ ; }else{ return -1; } // rc = SQLAllocStmt(*hdbc,hstmt); printf("SQLAllocStmt --> %d\n", rc); if(rc != 0){return -1;} return 0; } int closedatabase(HENV *henv, HDBC *hdbc){ printf("--- CloseDataBase ---\n"); RETCODE rc; //データ・サーバーからの切断 rc = SQLDisconnect(*hdbc); printf("SQLDisconnect --> %d\n", rc); if(rc != 0){return -1;} //接続ハンドルの解放 rc = SQLFreeConnect(*hdbc); printf("SQLFreeConnect --> %d\n", rc); if(rc != 0){return -1;} //環境ハンドルの解放 rc = SQLFreeEnv(*henv); printf("SQLFreeEnv --> %d\n", rc); if(rc != 0){return -1;} return 0; } void command_select(HENV henv, HDBC hdbc,HSTMT hstmt){ UCHAR select[128]; RETCODE rc; SDWORD id; //SDWORD datalen; SDWORD data2len; //UCHAR data[64]; SDWORD data; UCHAR data2[256]; printf("select start\n"); strcpy((char *)select,"SELECT * from test"); if(SQLExecDirect(hstmt,select,SQL_NTS) != SQL_SUCCESS){ err(henv,hdbc,hstmt); return; } SQLBindCol(hstmt,1,SQL_C_SLONG,&id,0,NULL); SQLBindCol(hstmt,2,SQL_C_SLONG,&data,0,NULL); SQLBindCol(hstmt,3,SQL_C_CHAR,data2,(SWORD)sizeof(data2),&data2len); printf("\t ID DATA DATA2\n"); for(;;){ rc = SQLFetch(hstmt); if(rc == SQL_NO_DATA_FOUND)break; if(rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO){ err(henv,hdbc,hstmt); return; } printf("\t %d %d %s\n",id,data,data2); } return; } void err(HENV henv,HDBC hdbc,HSTMT hstmt){ SQLCHAR errstatus[256]; SQLCHAR errmsg[256]; SDWORD errcode; SWORD sz; SQLError(henv,hdbc,hstmt,errstatus,&errcode,errmsg,sizeof(errmsg),&sz); printf("%s(%d)%*s\n",errstatus,errcode,(int)sz,errmsg); }