我想让别人选择连接那个库,另外怎么记录下用户输入的数据源,以便在下次的时候
在下拉列表框中显示用户配置过的数据源????
谢谢帮助!!!!!!!!!!!!!

解决方案 »

  1.   

    先定义
    SQLHENV m_hSQLEnvironment;//环境变量
    CString m_sErrorMsg;//记录最后一条错误信息
    SQLRETURN m_iSQLResult;
    void class::GetODBCHandle()
    {
    m_iSQLResult = SQL_SUCCESS;
    m_hSQLEnvironment = SQL_NULL_HANDLE;
    m_iSQLResult = SQLAllocHandle(SQL_HANDLE_ENV,
      SQL_NULL_HANDLE,
      &m_hSQLEnvironment);
    if (m_iSQLResult != SQL_SUCCESS)
    {
    m_sErrorMsg = "SQLAllocHandle failed";
    return;
    }

    //设置ODBC版本属性,否则,系统将返回错误
    m_iSQLResult = SQLSetEnvAttr(m_hSQLEnvironment,
     SQL_ATTR_ODBC_VERSION,
     (SQLPOINTER)SQL_OV_ODBC3,
     0); 
    if (m_iSQLResult != SQL_SUCCESS)
    {
    m_sErrorMsg = "SQLSetEnvAttr 设置ODBC版本失败!";
    return;
    }
    }SQLRETURN class::GetDSNName(CString &dsnName, SQLUSMALLINT direction)
    {
    SQLSMALLINT dataLen1,dataLen2;
    SQLCHAR sTemp[DSNCOLLECTION_BUFLEN];
    SQLCHAR sDesc[DSNCOLLECTION_BUFLEN]; //查找DSN名称
    m_iSQLResult = SQLDataSources(m_hSQLEnvironment, 
      direction,
      sTemp,
      DSNCOLLECTION_BUFLEN,
      &dataLen1,
      sDesc,
      DSNCOLLECTION_BUFLEN,
      &dataLen2); switch (m_iSQLResult)
    {
    case SQL_SUCCESS:
    case SQL_SUCCESS_WITH_INFO:
    dsnName = sTemp;
    break;
    case SQL_NO_DATA://无数据
    m_sErrorMsg = "No more DSNs to enumerate";
    break;
    case SQL_ERROR://出错
    {
    SQLCHAR sState[10];
    SQLINTEGER iNativeError;
    SQLCHAR sMsg[DSNCOLLECTION_BUFLEN];
    (void)SQLGetDiagRec(SQL_HANDLE_ENV,
    m_hSQLEnvironment,
    1,
    sState,
    &iNativeError,
    sMsg,
    DSNCOLLECTION_BUFLEN,
    &dataLen2);
    m_sErrorMsg.Format("SQL_ERROR: %s:%s",sState,sMsg);
    }
    break;
    case SQL_INVALID_HANDLE:
    m_sErrorMsg = "无效句柄!";
    break;
    default:
    m_sErrorMsg = "未知错误!";
    }
    return m_iSQLResult;
    }
    输出数据源到你想要的地方
    if(this->GetDSNName(m_sDSNName,SQL_FETCH_FIRST) == SQL_SUCCESS)  //搜索所有数据源
    {
    for(SQLRETURN sqlreturn = SQL_SUCCESS;sqlreturn == SQL_SUCCESS;)
    {
    //这里输出就m_sDSNName就可以了
    sqlreturn = this->GetDSNName(m_sDSNName,SQL_FETCH_NEXT);
    }
    }
    else
    {
    // AfxMessageBox(this->m_sErrorMsg);
    return m_sErrorMsg;
    }
    return m_sErrorMsg;
      

  2.   

    另一种方法:
    windows目录下有一个文件,保存了所有的odbc配置信息。用搜索文件内容(搜索栏输入你的配置名)可找到该文件。接着你自己看着办吧