「C言語/C++/odbccsv」の編集履歴(バックアップ)一覧に戻る

C言語/C++/odbccsv - (2012/08/31 (金) 12:19:52) のソース

|開発環境|Microsoft Visual C++ 2010 Express (SP1)|
|実行環境|Microsoft Windows XP Home Edition (SP3)|
|プロジェクトの種類|Win32 コンソール アプリケーション|
|プロジェクト名|odbctest|
|アプリケーションの種類|コンソール アプリケーション|
|追加のオプション|空のプロジェクト|
|文字セット|Unicode|

参考
[[データの取得>http://eternalwindows.jp/windevelop/odbc/odbc05.html]]
[[郵便番号データダウンロード>http://www.post.japanpost.jp/zipcode/dl/kogaki.html]]
[[Text File Driver Programming Considerations>http://msdn.microsoft.com/en-us/library/windows/desktop/ms714091(v=vs.85).aspx]]

odbccsv.c
#highlight(c){{
#include <fcntl.h>	// _O_WTEXT
#include <io.h>		// _setmode
#include <stdio.h>	// _fileno
#include <Windows.h>
#include <sqlext.h>
#include <tchar.h>

#define DRIVER _T("Microsoft Text Driver (*.txt; *.csv)")
#define DATABASE _T("C:\\projects\\vc++\\odbctest")
#define TABLE _T("09TOCHIG.CSV")

int main()
{
	SQLHENV henv;	// 環境
	SQLHDBC hdbc;	// 接続
	SQLHSTMT hstmt;	// 命令
	SQLSMALLINT col;
	SQLSMALLINT i;
	SQLSMALLINT datatype;
	SQLTCHAR buf[256];
	SQLLEN len;
	SQLRETURN rc;	// retcode

	// BOMなしUTF-16LE
	_setmode(_fileno(stdout), _O_WTEXT);

	// データベースへの接続
	rc = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
	rc = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0);
	rc = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
	rc = SQLDriverConnect(hdbc, NULL,
		(SQLTCHAR *) _T("driver={") DRIVER _T("}; dbq=") DATABASE,
		SQL_NTS, NULL, 0, NULL, SQL_DRIVER_NOPROMPT);
	if (!SQL_SUCCEEDED(rc)) {
		return 1;
	}

	// 検索
	rc = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
	rc = SQLExecDirect(hstmt, (SQLTCHAR *) _T("select * from ") TABLE, SQL_NTS);
	if (!SQL_SUCCEEDED(rc)) {
		return 1;
	}
	rc = SQLNumResultCols(hstmt, &col);
	for (i = 1; i <= col; i++) {
		rc = SQLDescribeCol(hstmt, i, buf, _countof(buf), NULL,
			&datatype, NULL, NULL, NULL);
		_tprintf(_T("%d: %s %d\n"), i, buf, datatype);
		// Text 12 SQL_VARCHAR
		// Byte -6 SQL_TINYINT
	}
	while (1) {
		rc = SQLFetch(hstmt);
		if (rc == SQL_NO_DATA) break;
		if (rc == SQL_ERROR) break;
		for (i = 1; i <= col; i++) {
			SQLGetData(hstmt, i, SQL_C_TCHAR, buf, _countof(buf), &len);
			_tprintf(_T("%s%c"), buf, (i == col) ? _T('\n') : _T(','));
		}
	}
	SQLFreeHandle(SQL_HANDLE_STMT, hstmt);

	// 終了処理
	SQLDisconnect(hdbc);
	SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
	SQLFreeHandle(SQL_HANDLE_ENV, henv);
	return 0;
}
}}

schema.ini
#highlight(){{
[09TOCHIG.CSV]
ColNameHeader=False
Format=CSVDelimited
MaxScanRows=25
CharacterSet=OEM
Col1=全国地方公共団体コード Text
Col2=旧郵便番号 Text
Col3=郵便番号 Text
Col4=都道府県名カナ Text
Col5=市区町村名カナ Text
Col6=町域名カナ Text
Col7=都道府県名 Text
Col8=市区町村名 Text
Col9=町域名 Text
Col10=一町域が二以上の郵便番号で表される場合の表示 Byte
Col11=小字毎に番地が起番されている町域の表示 Byte
Col12=丁目を有する町域の場合の表示 Byte
Col13=一つの郵便番号で二以上の町域を表す場合の表示 Byte
Col14=更新の表示 Byte
Col15=変更理由 Byte
}}