在一个vc程序中,用了odbc去访问一个Access数据库,在自己的机器上可以运行,把整个工程考到另一个机器上,运行的时候就报出“未发现数据源名称并且未制定默认驱动程序”。我自己的机器时自己配置的ODBC,想请教一下,我的这个程序怎么让它在程序里配置,使能在原来没有配置的机器上使用。
另外,在程序最后打包的时候,应该怎么做才行呢?这几天被这个问题搞昏了,没有找到适合我这个问题的资料。请各位指导了,多谢

解决方案 »

  1.   

    HKEY hkey;
    GetCurrentDirectory(256,(char *)szDir);
    sprintf(szValue,"%s\\Database\\dbodbc8.dll",szDir);
    RegCreateKey(HKEY_LOCAL_MACHINE,"Software\\ODBC\\ODBCINST.INI\\Sandy Database Engine",&hkey);
    RegSetValueEx(hkey,"Driver",0,REG_SZ,(const BYTE *)szValue,256);
    RegSetValueEx(hkey,"Setup",0,REG_SZ,(const BYTE *)szValue,256);
    RegCloseKey(hkey);
    RegCreateKey(HKEY_LOCAL_MACHINE,"Software\\ODBC\\ODBC.INI\\ODBC Data Sources",&hkey);
    strcpy(szValue,"DentistryDoctor's Database Engine");
    RegSetValueEx(hkey,"dvr",0,REG_SZ,(const BYTE *)szValue,256);
    RegCloseKey(hkey);
    RegCreateKey(HKEY_LOCAL_MACHINE,"Software\\ODBC\\ODBC.INI\\dvr",&hkey);
    strcpy(szValue,"YES");
    RegSetValueEx(hkey,"AutoStop",0,REG_SZ,(const BYTE *)szValue,256);
    RegSetValueEx(hkey,"KeysInSQLStatistics",0,REG_SZ,(const BYTE *)szValue,256);
    sprintf(szValue,"%s\\Database\\dvr.db",szDir);
    RegSetValueEx(hkey,"DatabaseFile",0,REG_SZ,(const BYTE *)szValue,256);
    strcpy(szValue,"dvr");
    RegSetValueEx(hkey,"DatabaseName",0,REG_SZ,(const BYTE *)szValue,256);
    strcpy(szValue,"NO");
    RegSetValueEx(hkey,"Debug",0,REG_SZ,(const BYTE *)szValue,256);
    RegSetValueEx(hkey,"DisableMultiRowFetch",0,REG_SZ,(const BYTE *)szValue,256);
    RegSetValueEx(hkey,"Integrated",0,REG_SZ,(const BYTE *)szValue,256);
    sprintf(szValue,"%s\\Database\\dbodbc8.dll",szDir);
    RegSetValueEx(hkey,"Driver",0,REG_SZ,(const BYTE *)szValue,256);
    sprintf(szValue,"%s\\Database\\dbeng8.exe -c 4m",szDir);
    RegSetValueEx(hkey,"Start",0,REG_SZ,(const BYTE *)szValue,256);
    strcpy(szValue,"dba");
    RegSetValueEx(hkey,"UID",0,REG_SZ,(const BYTE *)szValue,256);
    strcpy(szValue,"****************************");
    RegSetValueEx(hkey,"EncryptedPassword",0,REG_SZ,(const BYTE *)szValue,256);
    RegCloseKey(hkey);
      

  2.   

    我做毕业设计时用到了。
        1、必须将头文件ODBCINST.H包含进来,否则编译时会提示两个错误:                 error C2065: 'SQLConfigDataSource' : undeclared identifier                error C2065: 'ODBC_ADD_DSN' : undeclared identifier                       这是因为函数在该头文件中declare                                          2、SQLConfigDataSource的参数设置                                            第三个参数可参考ODBC管理器的驱动程序页。                                     第四个参数说明数据源的属性,由一系列子串构成,每个子串之间用"\0"符隔开。   第四个参数的设置可参考注册表相关部分。                            void CMdbDlg::OnButton1() 
    {
    // TODO: Add your control notification handler code here
    CDatabase db;if(!SQLConfigDataSource(NULL,ODBC_ADD_DSN,"Microsoft Access Driver (*.mdb)","DSN=kq\0DBQ=d:\\kaoqin.mdb\0FIL=MS Access;\0"))
    {
    AfxMessageBox("不能注册数据源!");
    return;
    }
    try
    {
    db.Open("kq");
    }
    catch(CDBException* e)
    {
    AfxMessageBox(e->m_strError);
    return;
    }}
      

  3.   

    你创建一个ODBC DSN,再看看注册表中HKCU\ODBC\ODBC.INI(对于用户DSN)或HKLM\ODBC\ODBC.INI(对于用户DSN)就明白了,程序中自已写注册表。
      

  4.   

    直接在程序初始化里动态配置一下即可:例:SQLConfigDataSource(NULL,ODBC_ADD
    _SYS_DSN,"Microsoft Access Driver (*.mdb)\0","
    DSN=TryDB\0DBQ=D:\\Database\\
    try.mdb\0DEFAULTDIR=D:\\DATABASE\0\0");
      

  5.   

    建议使用SQLConfigDataSource。
    The following example uses the ::SQLConfigDataSource ODBC API function to create a new Excel data source called "New Excel Data Source":SQLConfigDataSource(NULL,ODBC_ADD_DSN, "Excel Files (*.xls)", 
                       "DSN=New Excel Data Source\0" 
                       "Description=New Excel Data Source\0" 
                       "FileType=Excel\0" 
                       "DataDirectory=C:\\EXCELDIR\0" 
                       "MaxScanRows=20\0");
    Note that the data source is actually a directory (C:\EXCELDIR); this directory must exist. The Excel driver uses directories as its data sources, and files as the individual tables (one table per .xls file).加别的文件也一样
      

  6.   

    在程序的app类的InitInstance()函数里加入配置odbc数据源的代码。
    SQLConfigDataSource(NULL,ODBC_ADD
    _SYS_DSN,"Microsoft Access Driver (*.mdb)\0","
    DSN=YourDB\0DBQ=c:\\DB\\
    your.mdb\0DEFAULTDIR=c:\\DB\0\0");
      

  7.   

    但像ANYWHERE这种,如果不在客户机上装ANYWHERE,直接使用SQLConfigDataSource是不能配置成功的,ACCESS例外。直接写注册可以更灵活。
      

  8.   

    多谢大家
    另外问以下,要想获得相关的知识,除了上网问,自己怎么获得呢,在msdn里也不是很好查
    我去试一下,回来再谢谢各位
      

  9.   

    下面的代码你只要修改lhwy就可以直接用,还要把你的数据库放在工程目录下。CString sPath;
    GetModuleFileName(NULL,sPath.GetBufferSetLength(MAX_PATH+1),MAX_PATH);
    sPath.ReleaseBuffer ();
    int nPos;
    nPos=sPath.ReverseFind ('\\');
    sPath=sPath.Left (nPos);
    nPos=sPath.ReverseFind('\\');
        sPath=sPath.Left (nPos);
    CString lpszFile = sPath + "\\lhwy.mdb";

       
        char* szDesc;
    int mlen;
    szDesc=new char[256];
    sprintf(szDesc,"DSN=%s? DESCRIPTION=TOC support source? DBQ=%s? FIL=MicrosoftAccess? DEFAULTDIR=%s?? ","lhwy",lpszFile,sPath); mlen = strlen(szDesc);
        for (int i=0; i<mlen; i++)
    {
    if (szDesc[i] == '?')
     szDesc[i] = '\0';
    }  if (FALSE == SQLConfigDataSource(NULL,ODBC_ADD_DSN,"Microsoft Access Driver (*.mdb)\0",(LPCSTR)szDesc))
      AfxMessageBox("SQLConfigDataSource Failed");
      

  10.   

    http://community.csdn.net/Expert/topic/2856/2856221.xml?temp=.7915766http://dev.csdn.net/develop/article/24/24103.shtm