• 4784阅读
  • 3回复

qt查询全部数据源 [复制链接]

上一主题 下一主题
离线jiang200503
 
只看楼主 倒序阅读 楼主  发表于: 2010-11-23
qt有没有方法可以查出电脑中配置的所有数据源?
离线dbzhang800

只看该作者 1楼 发表于: 2010-11-23
http://www.beiww.com/doc/oss/smart-questions.html

"电脑中配置的所有数据源" 是指什么?
离线jiang200503
只看该作者 2楼 发表于: 2010-11-24
回 1楼(dbzhang800) 的帖子
就是在windows里面有个“odbc数据源管理器”,在“系统DSN”或者“用户DSN”里面会有已经配置好的数据源的名称,我想把这些读出来。就是图中红线里面的部分
离线lxbin2003

只看该作者 3楼 发表于: 2010-11-27
下面一段程序是我写的,希望对你有帮助。
/*放在头部的定义 */
#define ODBC_ADD_DSN 1
#define ODBC_CONFIG_DSN 2
#define ODBC_REMOVE_DSN 3
#define ODBC_ADD_SYS_DSN 4
#define ODBC_CONFIG_SYS_DSN 5
#define ODBC_REMOVE_SYS_DSN 6
#define ODBC_REMOVE_DEFAULT_DSN 7


#define SQL_FETCH_NEXT  1
#define SQL_FETCH_FIRST   2
#define SQL_FETCH_LAST  3
#define SQL_FETCH_PRIOR   4
#define SQL_FETCH_ABSOLUTE   5
#define SQL_FETCH_RELATIVE   6

#define SQL_FETCH_FIRST_USER 31
#define SQL_FETCH_FIRST_SYSTEM 32

/*下面一个函数,是将所有的数据源取出来放到QTableWidget中,两列,一列显示名称,另一列显示驱动名称*/
void DsnDialog::loadDSN()
{
#ifdef Q_OS_WIN32
    typedef int (__stdcall *SQLAllocEnvType)(long*);
    typedef int (__stdcall *SQLFreeEnvType)(long);
    typedef int (__stdcall *SQLDataSourcesType)(long,int,char *,int,int *,char *,int,int *);
    typedef int (__stdcall *SQLDriversType)(long,int,char *,int,int *,char *,int,int *);
    QLibrary lib("odbc32",this);
#else
    typedef int ( *SQLAllocEnvType)(long*);
    typedef int ( *SQLFreeEnvType)(long);
    typedef int ( *SQLDataSourcesType)(long,int,char *,int,int *,char *,int,int *);
    typedef int ( *SQLDriversType)(long,int,char *,int,int *,char *,int,int *);
    QLibrary lib("odbc",this);
#endif
    long henv=0;
    char dsn[512],desc[512];
    int ndsn=0;
    int ndesc=0;
    int i=0;
    QTableWidgetItem *item=0;
    QMap<QString,QString> map1;
    QMap<QString,QString> map2;

    if(lib.load())
    {
        SQLAllocEnvType SQLAllocEnv=(SQLAllocEnvType)lib.resolve("SQLAllocEnv");
        SQLFreeEnvType  SQLFreeEnv=(SQLFreeEnvType)lib.resolve("SQLFreeEnv");
        SQLDataSourcesType SQLDataSources=(SQLDataSourcesType)lib.resolve("SQLDataSources");
        SQLDriversType SQLDrivers=(SQLDriversType)lib.resolve("SQLDrivers");
        if(SQLAllocEnv && SQLFreeEnv && SQLDataSources && SQLDrivers)
        {
            if(SQLAllocEnv(&henv)==-1)
            {
                qDebug()<<tr("SQLAllocEnv fail.");
            }
            else
            {
                int nRet=-1;
                memset(dsn,0,512); ndsn=0; memset(desc,0,512); ndesc=0;
                nRet=SQLDataSources(henv,SQL_FETCH_FIRST_USER,dsn,512,&ndsn,desc,512,&ndesc);
                while(nRet==0)
                {
                    map1[dsn]=desc;
                    memset(dsn,0,512); ndsn=0; memset(desc,0,512); ndesc=0;
                    nRet=SQLDataSources(henv,SQL_FETCH_NEXT,dsn,512,&ndsn,desc,512,&ndesc);
                }

                memset(dsn,0,512); ndsn=0; memset(desc,0,512); ndesc=0;
                nRet=SQLDataSources(henv,SQL_FETCH_FIRST_SYSTEM,dsn,512,&ndsn,desc,512,&ndesc);
                while(nRet==0)
                {
                    map2[dsn]=desc;
                    memset(dsn,0,512); ndsn=0; memset(desc,0,512); ndesc=0;
                    nRet=SQLDataSources(henv,SQL_FETCH_NEXT,dsn,512,&ndsn,desc,512,&ndesc);
                }

                SQLFreeEnv(henv);
            }
        }
        else
            qDebug()<<"error:"<<lib.errorString();
        lib.unload();

    }
    else
        qDebug()<<"loadDSN: load odbc lib fail"<<lib.errorString();


    QStringList list=map1.keys();
    list.sort();

    i=0;
    item=0;
    ui->tableUser->setRowCount(0);
    ui->tableUser->setRowCount(list.count());
    foreach(QString str,list)
    {
        item=new QTableWidgetItem(str);
        ui->tableUser->setItem(i,0,item);
        item=new QTableWidgetItem(map1[str]);
        ui->tableUser->setItem(i,1,item);
        i++;
    }

    list.clear();
    list=map2.keys();
    list.sort();

    i=0;
    item=0;
    ui->tableSystem->setRowCount(0);
    ui->tableSystem->setRowCount(list.count());
    foreach(QString str,list)
    {
        item=new QTableWidgetItem(str);
        ui->tableSystem->setItem(i,0,item);
        item=new QTableWidgetItem(map2[str]);
        ui->tableSystem->setItem(i,1,item);
        i++;
    }

    ui->tableSystem->resizeColumnsToContents();
    ui->tableSystem->resizeRowsToContents();
    ui->tableUser->resizeColumnsToContents();
    ui->tableUser->resizeRowsToContents();
}
快速回复
限100 字节
 
上一个 下一个