最終更新日: 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の登録することもできます。