使用Qt,我必须连接到数据库并从表中列出列的类型和名称。我有两个限制:
1 数据库类型一定不是问题(这必须适用于PostgreSQL, SQL Server, MySQL, ...)
2 当我在互联网上查看时,我发现了有效的解决方案,但前提是表中有一个或多个记录。而且我必须将列的类型和名称(无论是否记录到此数据库中)。
我在互联网上搜索了很多,但没有找到任何解决方案。
我正在寻找答案Qt/C++或使用可以做到这一点的查询。
感谢帮助 !
QSqlDriver::record()接受一个表名并返回一个QSqlRecord,您可以使用 从中获取字段QSqlRecord::field()。
所以,给定一个QSqlDatabase分贝,
db.driver(),db.tables(),QSqlRecord每个表的 adriver->record(tableName)和record.count()以及名称和类型record.field(x)根据前面的答案,我做了如下实现。它可以很好地工作,希望它可以帮助你。
{
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
我找到了解决方案。您只需record从QSqlDatabase. 您有一条空记录,但您仍然可以读取列类型和名称。
获取列名和类型是特定于数据库的操作。但是您可以拥有一个 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
}
我不知道 Qt 中有任何现有的机制允许这样做(尽管它可能存在 - 也许通过使用QSqlTableModel)。如果没有其他人知道这样的事情,我会做以下事情:
TableInfo列表的类。ColumnInfoITableInfoReader,它有一个纯虚TableInfo* retrieveTableInfo( const QString& tableName )方法。ITableInfoReader为您要支持的每个数据库创建一个子类。这允许执行仅在所有数据库的一个或一个子集上受支持的查询。TableInfoReaderFactory类,该类允许ITableInfoReader根据使用的数据库创建适当的子类这允许您通过仅使用ITableInfoReader接口使您的主代码独立于数据库。
例子:
输入:
ITableInfoReader* tableInfoReader =
_tableInfoReaderFactory.createTableReader( database );
QList< ColumnInfo* > columnInfos = tableInfoReader->retrieveTableInfo( tableName );
foreach( ColumnInfo* columnInfo, columnInfos )
{
qDebug() << columnInfo.name() << columnInfo.type();
}