ODBC登録プログラム

最終更新日: 2010年 9月 4日

HomeBack

  1. プロジェクトを使用しないサンプル
  2. プロジェクトを使用したサンプル
  3. ODBCCONF.EXE


DSNを登録するプログラムを、フリーのVisual C++ 2008 Express Editionで作成する方法です。

プロジェクトを使用しないサンプル

Visual C++のプロジェクトを使用せずに、コマンドラインからコンパイルするサンプルです。

サンプル odbc.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;
    }
}
	

ODBCCONF.EXE

WindowsではODBCの登録を行う ODBCCONF.EXE という コマンドがあります。このコマンドを使用してDSNの登録することもできます。



HomeBack