使用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
列表的类。ColumnInfo
ITableInfoReader
,它有一个纯虚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();
}