最終更新日: 2010年 9月 4日
DSNを登録するプログラムを、フリーのVisual C++ 2008 Express Editionで作成する方法です。
Visual C++のプロジェクトを使用せずに、コマンドラインからコンパイルするサンプルです。
/**********************************************
ODBC登録プログラム
コマンドプロンプトからコンパイルする場合、次のようなバッチファイルを作成して
実行すると、コンパイルに必要な環境変数がセットされます。
SET PATH=%PATH%;"C:\Program FIles\Microsoft Visual Studio 9.0\VC\bin"
vcvars32.bat
コンパイルする場合は以下のように指定します。 /out:に実行ファイル名を指定します。
> cl odbc.c /link /out:con_odbc.exe user32.lib odbccp32.lib
上記でコンパイルすると、実行ファイル「con_odbc.exe」ができます。
ODBCの登録を行う場合 > con_odbc.exe -a
ODBCの登録を削除する場合 > con_odbc.exe -r
***********************************************/
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <odbcinst.h>
#include "sql.h"
#define MESSAGE_MAX 512
void usage(void);
int odbc_add(UCHAR*, UCHAR*);
int odbc_remove(UCHAR*, UCHAR*);
void odbc_print_error(char*);
int main(int argc, char *argv[])
{
int ret;
int i;
/*
* ドライバが SQL Serverの場合、szAttributes に ユーザー名のUID、
* パスワードのPWDを指定するとエラーになり、登録に失敗します。
* ODBCへの登録はユーザーDSNです。
*/
// UCHAR *szDriver = "SQL Native Client";
UCHAR *szDriver = "SQL Server";
UCHAR *szAttributes =
"DSN=MyDSN\0"
"DESCRIPTION=MyDSN sql native client\0"
"SERVER=.\\SQLExpress\0";
if (argc == 2) {
ret = 1;
for(i = 0; i < argc; i++) {
if (strcmp("-a", argv[i]) == 0) {
ret = odbc_add(szDriver, szAttributes);
break;
} else if (strcmp("-r", argv[i]) == 0) {
ret = odbc_remove(szDriver, szAttributes);
break;
}
}
return ret;
} else {
usage();
return 1;
}
}
void usage() {
printf("option -a: add ODBC\n"
" -r: remove ODBC\n"
);
}
/**********************************************
ユーザーDSNの登録
***********************************************/
int odbc_add(UCHAR *szDriver, UCHAR *szAttributes)
{
RETCODE ret;
ret = SQLConfigDataSource(NULL,
ODBC_ADD_DSN,
szDriver,
szAttributes);
if (ret != 1) {
odbc_print_error("ODBCへの登録に失敗しました。");
return 0;
} else {
printf("ODBCへの登録に成功しました。\n");
return 1;
}
}
/**********************************************
ユーザーDSNの削除
***********************************************/
int odbc_remove(UCHAR *szDriver, UCHAR *szAttributes)
{
RETCODE ret;
ret = SQLConfigDataSource(NULL,
ODBC_REMOVE_DSN,
szDriver,
szAttributes);
if (ret != 1) {
odbc_print_error("ODBCからの削除に失敗しました。");
return 0;
} else {
printf("ODBCから削除しました。\n");
return 1;
}
}
/**********************************************
エラーメッセージの表示
***********************************************/
void odbc_print_error(char *msg)
{
WORD iError = 1;
DWORD pfErrorCode;
WCHAR lpszErrorMsg[MESSAGE_MAX + 1];
WORD cbErrorMsgMax = MESSAGE_MAX;
SQLInstallerError(iError, &pfErrorCode, (LPSTR)lpszErrorMsg, cbErrorMsgMax, NULL);
printf("%s\nエラー内容:%s\n", msg, lpszErrorMsg);
}
Express Editionのプロジェクトを使用したサンプルです。
注. Vistaでビルドした場合、XPで実行することができませんでした。 しかし、XPでビルドした場合はXPで実行できます。 何か設定があるのかも知れませんが、調べていません。
#include "stdafx.h"
#include <windows.h>
#include <odbcinst.h>
#include "sql.h"
#define MESSAGE_MAX 512
int _tmain(int argc, _TCHAR* argv[])
{
RETCODE retcode;
WCHAR *szDriver = L"SQL Native Client";
WCHAR *szAttributes =
L"DSN=MyDSN\0"
L"DESCRIPTION=SQLConfigDSN Sample\0"
L"SERVER=MySQL\0"
L"ADDRESS=MyServer\0"
L"NETWORK=dbmssocn\0"
L"DATABASE=pubs\0";
// UID, PWDを設定すると登録に失敗する
// L"UID=sa\0"
// L"PWD=\0";
retcode = SQLConfigDataSource(NULL,
ODBC_ADD_DSN,
szDriver,
szAttributes);
WORD iError = 1;
DWORD pfErrorCode;
WCHAR lpszErrorMsg[MESSAGE_MAX + 1];
WORD cbErrorMsgMax = MESSAGE_MAX;
char sjis[MESSAGE_MAX + 1];
if (retcode != 1) {
SQLInstallerError(iError, &pfErrorCode, (LPWSTR)lpszErrorMsg, cbErrorMsgMax, NULL);
// ワイド文字からシフトJISへ変換
WideCharToMultiByte(932,0,lpszErrorMsg,-1,sjis,sizeof(sjis),NULL,NULL);
printf("ODBCへの登録に失敗しました。\nエラー内容:%s\n戻り値:%d", sjis, retcode);
return 1;
} else {
printf("ODBCへの登録に成功しました。\n");
return 0;
}
}
WindowsではODBCの登録を行う ODBCCONF.EXE という コマンドがあります。このコマンドを使用してDSNの登録することもできます。