最好能分别进行:  
(1)如何得到本地所有“用户DSN”?  
(2)如何得到本地所有“系统DSN”?  
(3)如何得到本地所有“文件DSN”?

解决方案 »

  1.   

    XP os
    控制面板里面管理工具中的"ODBC数据源"
    Win??
    控制面板里面就有吧
      

  2.   


    BOOL source::WriteDsn(FILE* fp)
    {
    ASSERT(fp==NULL);
    CStringArray arrSystemDSN;
    SQLCHAR szDSN[SQL_MAX_DSN_LENGTH+1];
    SQLCHAR szDescription[100];
    SQLRETURN retCode;
    SQLHENV hEnv;
        SQLUSMALLINT uDirection; //////////////////////////////////////////
    //先提取系统数据源,存放在阿arrSystemDSN数组中
        uDirection=SQL_FETCH_FIRST_SYSTEM;
        retCode=::SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&hEnv);
    if(retCode!=SQL_SUCCESS) return FALSE;
        retCode=::SQLSetEnvAttr(hEnv,SQL_ATTR_ODBC_VERSION,(SQLPOINTER)SQL_OV_ODBC3,SQL_IS_INTEGER); while(retCode==SQL_SUCCESS||retCode==SQL_SUCCESS_WITH_INFO)
    {
        retCode=SQLDataSources(hEnv,uDirection,
                          (UCHAR*)szDSN,
             sizeof(szDSN),
            NULL,(UCHAR*)szDescription,
            sizeof(szDescription),NULL);
        uDirection=SQL_FETCH_NEXT;
        if(retCode!=SQL_SUCCESS_WITH_INFO&&retCode!=SQL_SUCCESS)
       TRACE("SQLData Sources retuns:%d",retCode);
        else
    {
              if(CString(szDescription)==CString("SQL Server"))
    {
       if(szDSN==CString("LocalServer")||szDSN==CString("MQIS")||szDSN==CString("Master_DSN"))
       continue;
       CString strDSN;
       arrSystemDSN.Add(szDSN);
       strDSN.Format("[#source=%s,,desc=%s,,user=sa,,code=sa,,type=SYSTEM_DSN#]\n",szDSN,szDescription,"","");
       fprintf(fp,"%s",strDSN);
    }
    }
    }
        SQLFreeHandle(SQL_HANDLE_ENV,hEnv);
    ////////////////////////////////////////////////
    //根据arrSystemDSN江各个数据源的表结构到文件里
    char *szUser="sa",*szPwd="sa";
    char szDsn[256];
    int iSysCount=arrSystemDSN.GetUpperBound()+1;
        for(int j=0;j<iSysCount;j++) //data source
    {
           sprintf(szDsn,"%s",arrSystemDSN.GetAt(j));
       if(!m_DB.Open(szDsn,szUser,szPwd))
       {
         TRACE("打开数据库失败 !");
        return FALSE;
       }
       if(!m_DB.ListAllTable("'TABLE'"))
       {
         TRACE("枚举表失败!");
        return FALSE;
       }


       int nIndex=0;
       int nColType=0;
       CString strTable,strTemp,strSourceType;
       CStringArray arrRes;
       nIndex=m_DB.m_arrTableName.GetUpperBound()+1;
       for(int p=0;p<nIndex;p++)//table num
       {
         m_DB.DescTable(m_DB.m_arrTableName.GetAt(p));
        m_DB.GetRowColNum(m_DB.m_arrTableName.GetAt(p));
        strTable.Format("[#table=%s,,inof=%s,,recordnum=%d,,colnum=%d,,\n",
    m_DB.m_arrTableName.GetAt(p),szDsn,m_DB.m_nRecordNum,m_DB.m_nColumnNum);     int nColType;
        int nflag=0,nflag1=0;
        int nPriNum=m_DB.m_arrPrimaryKey.GetUpperBound()+1;
        for(int k=0;k<m_DB.m_nColumnNum;k++)//column
    {
    if(m_DB.m_arrColNullable.GetAt(k)==CString("NO"))
    nflag1=1;
    else nflag1=0;
        for(int q=0;q<nPriNum;q++)//primary key
    {
        if(k==(int)m_DB.m_arrPrimaryKey.GetAt(q))
    {
        nflag=1;
        break;
    }
        else  nflag=0;


        nColType=GetColumnType(m_DB.m_arrColTypeName.GetAt(k));
    //m_DB.m_arrColNullable.GetAt(i)
                    //列名<列类型>(列长度)[是否为空]'是否为主玛'
        strTemp.Format("%s<%d>(%d)[%d]\'%d\',",m_DB.m_arrColName.GetAt(k),
                   nColType,m_DB.m_arrColDataLength.GetAt(k),nflag1,nflag);
             strTable=strTable+strTemp;
    }
        strTable=strTable+CString("#]");
        fprintf(fp,"%s\n",strTable);
       } }
        return TRUE;
    }
      

  3.   

    以上代码没据系统数据源和用户数据源并写道文件里
    主要用到函数
    SQLDataSources