// sel_addr.c
// VC++ 2010 Express
// マルチバイト文字セット

#define _CRT_SECURE_NO_WARNINGS

#include <Windows.h>
#include <sqlext.h>
#include <stdio.h>

#define DRIVER "Microsoft Access Driver (*.mdb)"
#define DATABASE "C:\\projects\\vc++\\odbctest\\odbctest.mdb"

int main()
{
	HENV henv;
	HDBC hdbc;
	HSTMT hstmt;
	SQLCHAR CompliteConnect[255];
	SWORD len;
	SQLCHAR sqlchar[256];
	SQLINTEGER strlen;
	RETCODE rc;
	char addr[200];
	int i;

	// データベースへの接続
	rc = SQLAllocEnv(&henv);
	rc = SQLAllocConnect(henv, &hdbc);
	rc = SQLDriverConnect(hdbc, NULL,
		(SQLCHAR *)"Driver={"DRIVER"}; DBQ="DATABASE,
		SQL_NTS, CompliteConnect, _countof(CompliteConnect), &len, SQL_DRIVER_NOPROMPT);
	if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {
		fprintf(stderr, "データベースファイルを開けません\n");
		return 1;
	}

	// 検索
	while (1) {
		printf("住所の一部(qで終了)>");
		scanf("%199s", addr);
		if (strcmp(addr, "q") == 0) {
			break;
		}
		sprintf((char *)sqlchar,
			"select * from 郵便番号データ where 住所 like '%%%s%%'", addr);
		rc = SQLAllocStmt(hdbc, &hstmt);
		rc = SQLExecDirect(hstmt, sqlchar, SQL_NTS);
		for (i = 0; ; i++) {
			rc = SQLFetch(hstmt);
			if (rc == SQL_NO_DATA) break;
			if (rc == SQL_ERROR) break;
			SQLGetData(hstmt, 1, SQL_C_CHAR, sqlchar, _countof(sqlchar), &strlen);
			printf("%s,", sqlchar);
			SQLGetData(hstmt, 2, SQL_C_CHAR, sqlchar, _countof(sqlchar), &strlen);
			printf("%s\n", sqlchar);
		}
		rc = SQLFreeStmt(hstmt, SQL_DROP);
		if (i == 0) {
			printf("該当するデータはありません\n");
		}
	}

	rc = SQLDisconnect(hdbc);
	rc = SQLFreeConnect(hdbc);
	rc = SQLFreeEnv(henv);

	return 0;
}
