金子邦彦研究室情報工学全般MySQL の利用Visual C++ での ODBC プログラミング例

Visual C++ での ODBC プログラミング例

ODBC を用いて MySQL の利用 のデータベースを操作する簡単なプログラム例

MySQL コマンドラインプログラムでの実行例

プログラムの実行結果例

MySQL コマンドラインクライアントと同様の結果が出ていることを確認できた.

[image]

プログラムのソースコード

#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);
}