ODBC(Open Database Conectivity)即开放式数据库互联,作为Windows开放性结构的一个重要部分已经为很多的Windows程序员所熟悉,ODBC的工作依赖于数据库制造商提供的驱动程序,使用ODBC API的时候,Windows的ODBC管理程序,把数据库访问的请求传递给正确的驱动程序,驱动程序再使用SQL语句指示DBMS完成数据库访问工作,因此,ODBC的存在为我们开发应用数据库程序提供了非常强大的能力和灵活性。 ---- 为了使ODBC能与数据库一起工作,必须把数据库注册到ODBC驱动程序管理器,这项工作可以通过定义一个DSN或数据源名字来完成。通常,我们只能手动打开系统控制面板,运行其中的ODBC数据源管理器,手工配置数据源,但是这项工作对用户而言过于复杂,我们必须考虑用程序替用户完成这些配置工作。 ---- 因此许多程序员在发布自己编写的数据库软件时候都希望能有一个优秀的安装程序能够自动设置好ODBC数据源,虽然现在InstallShield等一些优秀的安装制作软件可以帮助我们实现此类功能,但毕竟缺少灵活,程序员不能完全控制它,事实上,我们完全可以自己编写一些程序实现此类功能,实现的方法有几种,一种办法是用程序修改Windows注册表,程序员可以用Windows API函数增改HKEY_LOCAL_MACHINE\Software\ODBC下的ODBC.INI中的键值,这种方法比较烦琐。我现在推荐一种在程序中使用ODBC API的方法,程序员可以在任何时候都可以用Visual C++编写的程序调用这些API函数来设置ODBC数据源。 ---- 下面我用MFC写一个程序来演示如何实现这个功能: ---- 首先,打开Visual C++,在File菜单上选New,然后选定MFC AppWizard(exe)类的项目,Project name我们定为try,按下OK键,下一Step 1屏幕中选Dialog based,由于不必用到后面的选项,此时即可按下Finish键,结果系统将生成一个新的项目。完成上述工作后,在左侧Workspace窗口中,选择ResourceView,打开try resources中的Dialog资源,选择并打开IDD_TRY_DIALOG对话窗口,在Controls菜单窗口中点选按键图标,回到IDD_TRY_DIALOG对话窗口并点击此窗口,将生成一个名叫Button1的按键,选中此按键再按鼠标右键,在弹出式菜单上选Properties选项,在出现的对话框中把Caption项的Button1值改为Setup ODBC,关闭此对话框,再选中此按键按鼠标右键,选择ClassWizard,在出现的对话窗口中,Object Ids选IDC_BUTTON1,Messages中双击BN_CLICKED,此时弹出Add Member Function对话窗,Member function name是OnButton1,按OK键。在Member functions选项中双击onButton1 ON_IDC_BUTTION1:BN_CLICKED,在出现的void CTryDlg::OnButton1()函数中用以下ODBC API函数语句替换 //TODO: Add your control notification handler code here这条注释语句:   SQLConfigDataSource(NULL,ODBC_ADD
_SYS_DSN,"Microsoft Access Driver (*.mdb)\0","
DSN=TryDB\0DBQ=D:\\Database\\
try.mdb\0DEFAULTDIR=D:\\DATABASE\0\0");
  '---- 您可以根据您不同的设置需要修改上面的语句,SQLConfigDataSource一般有以下几个许可的参数: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: 删除省缺的数据源说明部分。需要注意的是,当我们使用SQLConfigDataSource ODBC API函数时必须声明包含系统的odbcinst.h头文件,所以我们再选择workspace窗口中FileView打开Header Files中try.h,在其中加入#include "odbcinst.h",如果不加入这个头文件,系统编译时就会显示undeclared identifier错误,在完成上述步骤后,假如我们立即编译并Link这个项目,会发现出现下面的错误: 
tryDlg.obj : error LNK2001: unresolved
external symbol _SQLConfigDataSource@16
Debug/try.exe : fatal error LNK1120: 
1 unresolved externals----  有些人可能因为找不出错误而放弃了,其实这是因为当我们使用SQLConfigDataSource 这个API函数时候必须用到odbccp32.dll,它是Microsoft提供的32位ODBC安装和管理的DLL,如果是16位必须用到odbcinst.dll,odbccp32.dll有一个import library,所以解决的办法就是把这个odbccp32.lib加到我们的项目中,我们可以打开Project系统菜单项,选Add to Project子菜单,在其中选Files项,打开VC安装目录下的\vc\lib\目录,文件类型选Library Files(.lib), 选择其中Odbccp32.lib后按OK键,然后重新编译即可通过,运行这个程序,将弹出对话窗,按下Setup ODBC按键,之后,您就可以通过控制面板的ODBC数据源管理器或注册表查看运行结果,您会发现,您的数据库已经成功的注册了。

解决方案 »

  1.   

    是登陆ODBC数据源把,这个我知道,因为我以前做过!!
    步骤如下:
    打开你的控制面板,若你用的是98则进去之后就会看到ODBC数据源的图标,若是2000则须进一步打开控制面板中的“管理工具”图标,在里面也会有ODBC数据源图标,双击该图标之后则会看到"ODBC数据源管理器",你可以选择“系统DSN”,以便对每个用户可见,之后单击“添加”按纽来选择你所须的数据库驱动程序,之后按“完成”按纽,在跳出的对话框的“数据源名”文本框中输入你所提供的数据源名,在单击“选择”按钮来选择数据源所在的路径,再单击“确定”按钮即可,就这么简单!!!!
    我的QQ:16879730 别忘了给我分噢!!    :)
      

  2.   

    大概是自动搜索数据源并自动加载,自动绑定吧。
    /////////////////////////////////////////add dsn
    TCHAR exeFullPath[MAX_PATH]; 
              GetCurrentDirectory(MAX_PATH,exeFullPath);
            CString tmp;
          tmp=CString("DSN=cafv|DESCRIPTION=support source|DBQ=")+
      CString("cafv.mdb")+
      CString("|DEFAULTDIR=")+
      CString(exeFullPath)+
      CString("||");
           
    int mlen;
    LPTSTR szDesc= new TCHAR[tmp.GetLength()+1]; _tcscpy(szDesc, tmp);
    mlen = strlen(szDesc);
      for (int i=0; i<mlen; i++)
      {
    if (szDesc[i] == '|')
      szDesc[i] = '\0';
      }
    return(::SQLConfigDataSource(NULL,ODBC_ADD_DSN,"Microsoft Access Driver (*.mdb)\0",(LPCSTR)szDesc));

    ////////////////////////////////////////////////////connect odbc
    CString errortext,errorcaption;
    errortext.LoadString(IDS_CONNECTODBCERROR);
    errorcaption.LoadString(IDS_ERRORCAPTION);
        if (SQL_SUCCESS == (rc =::SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE,&henv)))
    {
          if (SQL_SUCCESS == (rc = ::SQLSetEnvAttr(henv,SQL_ATTR_ODBC_VERSION, (SQLPOINTER) SQL_OV_ODBC3,SQL_IS_INTEGER)))
      {
            if (SQL_SUCCESS == (rc =::SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc)))
    {
              rc = ::SQLConnect(hdbc, (SQLCHAR*)str,SQL_NTS,(SQLCHAR*)"", SQL_NTS, (SQLCHAR*)"", SQL_NTS);
              if ((SQL_SUCCESS == rc)|| (SQL_SUCCESS_WITH_INFO == rc))
      {
                 bIsConnected = TRUE;
     
      }
      else
      MessageBox(errortext,errorcaption,MB_OK);
    }
    else
    MessageBox(errortext,errorcaption,MB_OK);
      }
      else
      MessageBox(errortext,errorcaption,MB_OK);
    }
        else
    MessageBox(errortext,errorcaption,MB_OK);
    //////////////////////////////////////////
    看有无帮助
      

  3.   

    在注册表项HKEY_LOCAL_MACHINE\Software\ODBC\ODBC.INI\项目下(Windows 2000),有若干个子键,键名即为ODBC数据源的名称。你的程序可以读取注册表来查看是否有你需要的数据源名称。
    至于Windows 98 ,大概位置也就是上面所说的吧。
      

  4.   

    请问romberg2002() :
    在MFC中有没有哪个函数可以用来检测和列出所有的ODBC数据源?
    Thx!
      

  5.   

    好象在OLE DB中有两个对象可以做你想做的,一个是枚举器(Enumerator),可以枚举出可用的数据源,另外一个是数据源对象(DataSource),它支持接口IDBDataSourceAdmin包含方法CreateDataSource()来创建一个新的数据源对象.不过用OLE DB好象有点累.
      

  6.   

    SQLConfigDataSource()
    好像就可以判断,换一个指定参数就可以!
    我说好像是因为肯定有!但是不是这个就记不清了:)
      

  7.   

    ODBC数据源的一些信息都存放在注册表中。HKEY_LOCAL_MECHINE\Software\ODBC\ODBCINST.INI从此键下可得知系统是否已经安装SQL Server驱动程序HKEY_LOCAL_MECHINE\Software\ODBC\ODBC.INI从此键下可得知系统已经建立的数据源.实现函数如下://////////////////////////////////////////////////////////////////
    //Function:  MakeSQLServerODBCDSN
    //
    //Purpose: 配置SQL Server数据源
    //Parameters:
    //  [in]
    //   strDBServer: 数据库所在主机
    //   strDBName:  数据库名称
    //   strDSN:   数据源名称
    //   strUID:   登陆用户
    //Return Value:
    //  -1: 没有安装SQL Server驱动程序
    //  -2: 其他错误
    //   0: 成功
    //////////////////////////////////////////////////////////////////
    int MakeSQLServerODBCDSN(LPCTSTR strDBServer,LPCTSTR strDBName,LPCTSTR strDSN,LPCTSTR strUID)
    {
     BOOL  bInstallDriver=TRUE;
     CRegKey  regKey; LONG lRet=regKey.Open(HKEY_LOCAL_MACHINE,"Software\\ODBC\\ODBCINST.INI\\SQL Server");
     if(lRet!=ERROR_SUCCESS)
     {
      bInstallDriver=FALSE;
     }
     else
     {
      char  szDirverPath[MAX_PATH]="";
      DWORD  dwCount=100;
      lRet=regKey.QueryValue(szDirverPath,"Driver",&dwCount);
      if((lRet!=ERROR_SUCCESS)||(dwCount<1))
      {
       DWORD dwErr=GetLastError();
       bInstallDriver=FALSE;
      }
      regKey.Close();
     }
     if(!bInstallDriver)
     {
      return -1;
     }
     CString  strKeyValueName="Software\\ODBC\\ODBC.INI\\";
     strKeyValueName+=strDSN;
     lRet=regKey.Create(HKEY_LOCAL_MACHINE,strKeyValueName);
     if(lRet!=ERROR_SUCCESS)
     {
      return -2;
     }
     regKey.SetValue(strDBName,"Database");
     regKey.SetValue("SQLSrv32.dll","Driver");
     regKey.SetValue(strDBServer,"Server");
     regKey.SetValue(strUID,"LastUser");
     regKey.m_hKey=HKEY_LOCAL_MACHINE;
     regKey.SetKeyValue("Software\\ODBC\\ODBC.INI\\ODBC Data Sources","SQL Server",strDSN);
     regKey.Close();
     return 0;

      

  8.   

    用WritePrivateProfileString和ReadPrivateProfileInt
      

  9.   

    列举数据源的函数是SQLDataSources
    具体使用可以参看msdn
      

  10.   

    我好象到现在也没碰到MFC中那个类能做到这一点,也许因为每次碰到这个问题,我都用以前的方法解决,要不你试试楼上计委的方法把