6

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

1 数据库类型一定不是问题(这必须适用于PostgreSQL, SQL Server, MySQL, ...)

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

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

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

感谢帮助 !

4

5 回答 5

19

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

所以,给定一个QSqlDatabase分贝,

  1. 获取驱动程序db.driver()
  2. 使用 获取表列表db.tables()
  3. 从 中获取QSqlRecord每个表的 adriver->record(tableName)
  4. 获取字段的数量record.count()以及名称和类型record.field(x)
于 2013-09-17T07:22:10.577 回答
1

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

  {
      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
于 2020-12-26T14:26:00.047 回答
0

我找到了解决方案。您只需recordQSqlDatabase. 您有一条空记录,但您仍然可以读取列类型和名称。

于 2013-10-02T07:17:10.127 回答
0

获取列名和类型是特定于数据库的操作。但是您可以拥有一个 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
}
于 2013-09-16T13:51:21.783 回答
0

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

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

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

例子:


输入:

  • database : 用于执行查询的 QSqlDatabase
  • tableName:要检索有关信息的表的名称

ITableInfoReader* tableInfoReader = 
    _tableInfoReaderFactory.createTableReader( database );

QList< ColumnInfo* > columnInfos = tableInfoReader->retrieveTableInfo( tableName );
foreach( ColumnInfo* columnInfo, columnInfos )
{
    qDebug() << columnInfo.name() << columnInfo.type(); 
}
于 2013-09-16T13:51:25.227 回答