Qt / SQL - 从没有记录的表中获取列类型和名称

时间:2013-09-16 13:16:42

标签: c++ sql qt types

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

1数据库类型不能成为问题(这必须适用于PostgreSQLSQL ServerMySQL,...)

2当我在互联网上查看时,我找到了可行的解决方案,但前提是表中有一个或多个reocrd。而且我必须将列的类型和名称带或不带记录到此数据库中。

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

我正在寻找Qt/C++中的答案或使用可以执行此操作的查询。

感谢您的帮助!

4 个答案:

答案 0 :(得分:13)

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

所以,给定QSqlDatabase db,

  1. 使用db.driver()
  2. 获取驱动程序
  3. 使用db.tables()
  4. 获取表格列表
  5. QSqlRecord
  6. 获取每个表的driver->record(tableName)
  7. 使用record.count()获取字段数,使用record.field(x)
  8. 获取名称和类型

答案 1 :(得分: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
}

答案 2 :(得分:0)

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

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

    示例:


    输入:

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

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

答案 3 :(得分:0)

根据前面的回答,我做了如下实现,效果不错,希望能帮到你。

  {
      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