使用Qt
,我必须连接到数据库并从表中列出列的类型和名称。我有两个限制:
1数据库类型不能成为问题(这必须适用于PostgreSQL
,SQL Server
,MySQL
,...)
2当我在互联网上查看时,我找到了可行的解决方案,但前提是表中有一个或多个reocrd。而且我必须将列的类型和名称带或不带记录到此数据库中。
我在互联网上搜索了很多但我找不到任何解决方案。
我正在寻找Qt/C++
中的答案或使用可以执行此操作的查询。
感谢您的帮助!
答案 0 :(得分:13)
QSqlDriver::record()
获取一个表名并返回QSqlRecord
,您可以使用QSqlRecord::field()
从中获取字段。
所以,给定QSqlDatabase
db,
db.driver()
,db.tables()
,QSqlRecord
和driver->record(tableName)
record.count()
获取字段数,使用record.field(x)
答案 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
)。如果没有其他人知道这样的事情,我会做以下事情:
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();
}
答案 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