请问:在VC++6.0中如何自动配置ODBC?

解决方案 »

  1.   

    SQLConfigDataSource 函数http://dev.21tx.com/2005/06/02/12666.html还有很多的示例,网上搜
      

  2.   

    ODBC API提供了动态创建数据源的函数SQLConfig DataSource。该函数的原型如下:
    BOOL SQLConfigDataSource ( HWND hwndParent,WORD fRequest, LPCSTR lpszDriver, LPCSTR lpszAttributes ); 
    参数说明如下: (1)hwndParent用于指定父窗口句柄,在不需要创建数据源对话框时,可以将该参数指定为NULL。(2)参数fRequest用于指定函数的操作内容,取值如下:   ODBC_ADD_DSN: 加入一个新的用户数据源;   ODBC_CONFIG_DSN:修改一个存在的用户数据源;   ODBC_REMOVE_DSN:除一个存在的用户数据源; 
      
      ODBC_ADD_SYS_DSN:增加一个新的系统数据源;   ODBC_CONFIG_SYS_DSN:配置或者修改一个存在的系统数据源;   ODBC_REMOVE_SYS_DSN:删除一个存在的系统数据源;   ODBC_REMOVE_DEFAULT_DSN:删除省缺的数据源说明部分。(3)lpszDriver用于指定ODBC数据源的驱动  程序类别,例如,为了指定Access数据源,该参数应赋以字符串“Microsoft Access Driver (*.mdb)\0”;对SQL SERVER数据源,则应赋以字符串“SQL Server”。(4)参数lpszAttributes用于指定ODBC数据源属性。这个是具体的ODBC数据源连接字符串,如果不会写可以先用Windows提供有ODBC配置生成一个ODBC文件后再用记事本打开按它的格式自己写就行了。
      

  3.   

    先在控制面板---管理工具 建立ODBC数据源
      

  4.   

    ODBC API提供了动态创建数据源的函数SQLConfig DataSource。该函数的原型如下: 
    BOOL SQLConfigDataSource ( HWND hwndParent,WORD fRequest, LPCSTR lpszDriver, LPCSTR lpszAttributes ); 
    参数说明如下: (1)hwndParent用于指定父窗口句柄,在不需要创建数据源对话框时,可以将该参数指定为NULL。 (2)参数fRequest用于指定函数的操作内容,取值如下:   ODBC_ADD_DSN: 加入一个新的用户数据源;   ODBC_CONFIG_DSN:修改一个存在的用户数据源;   ODBC_REMOVE_DSN:除一个存在的用户数据源; 
      
      ODBC_ADD_SYS_DSN:增加一个新的系统数据源;   ODBC_CONFIG_SYS_DSN:配置或者修改一个存在的系统数据源;   ODBC_REMOVE_SYS_DSN:删除一个存在的系统数据源;   ODBC_REMOVE_DEFAULT_DSN:删除省缺的数据源说明部分。 (3)lpszDriver用于指定ODBC数据源的驱动   程序类别,例如,为了指定Access数据源,该参数应赋以字符串“Microsoft Access Driver (*.mdb)\0”;对SQL SERVER数据源,则应赋以字符串“SQL Server”。 (4)参数lpszAttributes用于指定ODBC数据源属性。这个是具体的ODBC数据源连接字符串,如果不会写可以先用Windows提供有ODBC配置生成一个ODBC文件后再用记事本打开按它的格式自己写就行了。
      

  5.   

    直接写注册表也可以:
    #define REG_ODBC _T("SOFTWARE\\ODBC\\ODBC.INI\\MyDB")
    #define REG_ODBC_NAME _T("MyDB") HKEY hKey;

    char lstrPath[255]={0};
    GetCurrentDirectory(255, lstrPath);
    strcat(lstrPath, _T("\\"));
    strcat(lstrPath, MDBFILE_NAME);

    // 查找数据源 
    LONG lResult=RegOpenKey(HKEY_LOCAL_MACHINE, REG_ODBC, &hKey);
    if (lResult == ERROR_SUCCESS)
    {
    DWORD nLength=0;
    char lstrDBQ[255]={0};

    // 验证数据库文件位置
    lResult=::RegQueryValueEx(hKey,_T("DBQ"),0L,0L,(BYTE * )(lstrDBQ),&nLength);
    RegCloseKey(hKey);

    if (lResult==ERROR_SUCCESS && !_tcscmp(lstrDBQ,lstrPath))
    {
    return TRUE;
    }
    else
    {
    ::RegDeleteKey(HKEY_LOCAL_MACHINE,REG_ODBC); 
    }
    }

    DWORD dwValue;
    CString strSubKey;
    char sysDir[MAX_PATH];
    char drvName[]=_T("\\ODBCJT32.dll");

    ::GetSystemDirectory(sysDir,MAX_PATH);
    strcat(sysDir, drvName);

    CFileFind findFile;

    if (!findFile.FindFile(sysDir))
    {
    AfxMessageBox(LoadString(IDS_LOADDBDRV), MB_OK|MB_ICONSTOP);
    return FALSE;
    }

    strSubKey=REG_ODBC;
    lResult=::RegCreateKeyEx(HKEY_LOCAL_MACHINE,(LPCTSTR)strSubKey,0,NULL,REG_OPTION_NON_VOLATILE,KEY_WRITE,NULL,&hKey,&dwValue);
    if (lResult != ERROR_SUCCESS)
    {
    RegCloseKey(hKey);
    return FALSE;
    }

    // 添加数据源

    CString strDbq=lstrPath;
    CString strDriver=sysDir;
    DWORD dwDriverId = 25;
    CString strFil=_T("MS Access;");
    DWORD dwSafeTransactions=0;
    CString strUid=_T("");
    CString strPwd=_T("");
    CString strDescript=_T("My Demo Database");

    ::RegSetValueEx(hKey,_T("DBQ"),0L,REG_SZ,(CONST BYTE * )((LPCTSTR) strDbq),strDbq.GetLength()+1);
    ::RegSetValueEx(hKey,_T("Description"),0L,REG_SZ,(CONST BYTE * )((LPCTSTR)strDescript),strDescript.GetLength()+1);
    ::RegSetValueEx(hKey,_T("Driver"),0L,REG_SZ,(CONST BYTE * )((LPCTSTR)strDriver),strDriver.GetLength()+1);
    ::RegSetValueEx(hKey,_T("DriverId"),0L,REG_DWORD,(CONST BYTE * )(&dwDriverId),sizeof(dwValue));
    ::RegSetValueEx(hKey,_T("FIL"),0L,REG_SZ,(CONST BYTE * )((LPCTSTR)strFil),strFil.GetLength()+1);
    ::RegSetValueEx(hKey,_T("SafeTransactions"),0L,REG_DWORD,(CONST BYTE *)(&dwSafeTransactions),sizeof(dwValue));
    ::RegSetValueEx(hKey,_T("UID"),0L,REG_SZ,(CONST BYTE *)((LPCTSTR)strUid),strUid.GetLength()+1);
    ::RegSetValueEx(hKey,_T("PWD"),0L,REG_SZ,(CONST BYTE *)((LPCTSTR)strPwd),strPwd.GetLength()+1);
    ::RegCloseKey(hKey);

    // 子键
    strSubKey += _T("\\Engines\\Jet");
    lResult=::RegCreateKeyEx(HKEY_LOCAL_MACHINE,(LPCTSTR)strSubKey,0,NULL,REG_OPTION_NON_VOLATILE,KEY_WRITE,NULL,&hKey,&dwValue);
    if (lResult != ERROR_SUCCESS)
    {
    RegCloseKey(hKey);
    return FALSE;
    }

    //设置子键下的各项参数
    CString strImplict=_T("");
    CString strUserCommit=_T("Yes");
    DWORD dwPageTimeout=5;
    DWORD dwThreads=3;
    DWORD dwMaxBufferSize=2048;

    ::RegSetValueEx(hKey,_T("ImplicitCommitSync"),0L,REG_SZ,(CONST BYTE *)((LPCTSTR)strImplict),strImplict.GetLength() + 1);
    ::RegSetValueEx(hKey,_T("MaxBufferSize"),0L,REG_DWORD , (CONST BYTE *)(&dwMaxBufferSize),sizeof(dwValue));
    ::RegSetValueEx(hKey,_T("PageTimeout"),0L,REG_DWORD,(CONST BYTE *)(&dwPageTimeout),sizeof(dwValue));
    ::RegSetValueEx(hKey,_T("Threads"),0L,REG_DWORD,(CONST BYTE * )(&dwThreads),sizeof(dwValue));
    ::RegSetValueEx(hKey,_T("UserCommitSync"),0L,REG_SZ,(CONST BYTE *)((LPCTSTR)strUserCommit),strUserCommit.GetLength());
    ::RegCloseKey(hKey);

    //设置odbc数据库引擎名称
    lResult=::RegCreateKeyEx(HKEY_LOCAL_MACHINE,_T("SOFTWARE\\ODBC\\ODBC.INI\\ODBC Data Sources"),0,NULL,REG_OPTION_NON_VOLATILE,KEY_WRITE,NULL,&hKey,&dwValue);
    if (lResult != ERROR_SUCCESS)
    {
    RegCloseKey(hKey);
    return FALSE;
    }

    CString strDbType=_T("Microsoft Access Driver (*.mdb)");
    ::RegSetValueEx(hKey,REG_ODBC_NAME,0L,REG_SZ,(CONST BYTE *)((LPCTSTR)strDbType),strDbType.GetLength());
    RegCloseKey(hKey);
      

  6.   

    自动添加数据源的代码如下:#include <odbcinst.h>char szDesc[223];
    int mlen;
    sprintf(szDesc,"DSN=%s? DBQ=%s? DEFAULTDIR=%s?? ","TryDB","D:\\Database\\try.mdb","D:\\DATABASE");mlen = strlen(szDesc);
    for (int i=0; i<mlen; i++)
    {
        if (szDesc[i] == '?')
            szDesc[i] = '\0';
    }SQLConfigDataSource(NULL,ODBC_ADD_DSN,"Microsoft Access Driver (*.mdb)\0",(LPCSTR)szDesc);