トップページ -> コンピュータ -> Cygwin, MinGW の活用 -> Visual C++ での ODBC プログラミング例
[サイトマップへ], サイト内検索:

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

サイト構成 連絡先,業績など 実践知識 データの扱い コンピュータ 教材 サポートページ

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