【问题标题】:Qt/SQL - Get column type and name from table without recordQt/SQL - 从没有记录的表中获取列类型和名称
【发布时间】:2013-09-20 15:53:20
【问题描述】:

使用Qt,我必须连接到数据库并从表中列出列的类型和名称。我有两个限制:

1 数据库类型一定不是问题(这必须适用于PostgreSQLSQL ServerMySQL、...)

2 当我在互联网上查看时,我发现了可行的解决方案,但前提是表中有一个或多个记录。而且我必须将列的类型和名称(有或没有记录)输入到这个数据库中。

我在互联网上搜索了很多,但没有找到任何解决方案。

我正在Qt/C++ 中寻找答案或使用可以做到这一点的查询。

感谢您的帮助!

【问题讨论】:

    标签: c++ sql qt types


    【解决方案1】:

    QSqlDriver::record() 接受一个表名并返回一个QSqlRecord,您可以使用QSqlRecord::field() 从中获取字段。

    所以,给定一个QSqlDatabase db,

    1. db.driver()获取驱动,
    2. 获取带有db.tables()的表列表,
    3. driver->record(tableName) 获取每个表的QSqlRecord,然后
    4. 使用record.count() 获取字段数,使用record.field(x) 获取名称和类型

    【讨论】:

    • 注意:QSqlDatabase 还有一个record 函数,使用它可以简化你的解决方案(当然还有QSqlDatabase::tables)
    【解决方案2】:

    根据前面的回答,我做了如下实现。它可以很好地工作,希望它可以帮助你。

      {
          QSqlDatabase db = QSqlDatabase::addDatabase("QSLITE", "demo_conn"); //create a db connection
          QString strDBPath = "db_path";
          db.setDatabaseName(strDBPath); //set the db file
          QSqlRecord record = db.record("table_name"); //get the record of the certain table
          int n = record.count();
          for(int i = 0; i < n; i++)
          {
            QString strField = record.fieldName(i);
          }
        }
        QSqlDatabase::removeDatabase("demo_conn"); //remove the db connection
    

    【讨论】:

    • 请在源代码之外添加一些说明。
    • 好的,我会补充的。
    【解决方案3】:

    获取列名和类型是特定于数据库的操作。但是您可以拥有一个 C++ 函数,该函数将根据您当前使用的 QSqlDriver 使用正确的 sql 查询:

    QStringlist getColumnNames()
    {
        QString sql;
    
        if (db.driverName.contains("QOCI", Qt::CaseInsensitive))
        {
             sql = ...
        }
        else if (db.driverName.contains("QPSQL", Qt::CaseInsensitive))
        {
             sql = ...
        }
        else
        {
             qCritical() << "unsupported db";
             return QStringlist();
        }
    
        QSqlQuery res = db.exec(sql);
        ...
        // getting names from db-specific sql query results
    }
    

    【讨论】:

    • 我认为使用 ODBC 驱动程序进行连接以抽象数据库类型。但是考虑到你所说的,使用 ODBC 驱动是不可能的,不是吗?
    【解决方案4】:

    我不知道 Qt 中有任何现有机制允许这样做(尽管它可能存在 - 可能通过使用 QSqlTableModel)。如果没有其他人知道这样的事情,我会做以下事情:

    1. 创建数据类来存储您需要的信息,例如一个 TableInfo 类,它存储了一个 ColumnInfo 对象列表,这些对象具有名称和类型。
    2. 创建一个接口,例如ITableInfoReader 有一个纯虚拟的TableInfo* retrieveTableInfo( const QString&amp; tableName ) 方法。
    3. 为您想要支持的每个数据库创建一个ITableInfoReader 的子类。这允许执行仅在所有数据库的一个或一个子集上受支持的查询。
    4. 创建一个TableInfoReaderFactory 类,该类允许根据使用的数据库创建适当的ITableInfoReader 子类

    这允许您通过仅使用ITableInfoReader 接口使您的主代码独立于数据库。

    例子:


    输入:

    • 数据库:用于执行查询的QSqlDatabase
    • tableName:要检索相关信息的表的名称

    ITableInfoReader* tableInfoReader = 
        _tableInfoReaderFactory.createTableReader( database );
    
    QList< ColumnInfo* > columnInfos = tableInfoReader->retrieveTableInfo( tableName );
    foreach( ColumnInfo* columnInfo, columnInfos )
    {
        qDebug() << columnInfo.name() << columnInfo.type(); 
    }
    

    【讨论】:

      【解决方案5】:

      我找到了解决方案。您只需从QSqlDatabase 调用record 函数。您有一条空记录,但您仍然可以读取列类型和名称。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-23
        • 1970-01-01
        • 2011-09-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多