获取数据库表中所有的字段-Qt

Posted hebbely

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了获取数据库表中所有的字段-Qt相关的知识,希望对你有一定的参考价值。

 

1.sqllite数据库

获取sqlite数据库的数据表字段的关键是 PRAGMA table_info('tablename')

bool getTableHeader(QSqlQuery &query, QString tableName, QString &header)
{
    header.clear();
    QString str = QString("PRAGMA table_info('%1')").arg(tableName);
    query.prepare(str);
    if (query.exec())
    {
        while (query.next())
        {
            header += query.value(1).toString();
            header += ",";
        }
        header += "\\n";
        return true;
    }else{
        qDebug() << query.lastError();
        return false;
    }
}

bool outPutTableInfo(QString tabNmae){    
    QSqlQuery query; 
    QString strTableNmae = tabNmae;  
    QString str = "PRAGMA table_info(" + strTableNmae + ")";       
    query.prepare(str);   
    if (query.exec())   
    {        
        while (query.next())     
        {           
            qDebug() << QString(QString::fromLocal8Bit("字段数:%1     字段名:%2     字段类型:%3")).arg(query.value(0).toString()).arg(query.value(1).toString()).arg(query.value(2).toString());        
        }  
        return true;
    }else{        
        qDebug() << query.lastError();        
        return false; 
    }
}

 

例子:将db文件转换为CSV文件

void updateLogToCSV()
{
    QSqlQuery query(db);
    QString header;
    QStringList tableList;
    tableList << "tb_Log";
    foreach (QString tableName, tableList) {
        if(getTableHeader(query, tableName, header))
        {
            QString csvFileName = QString(ORGDATA_ROOT) + tableName + ".csv";
            readAllDataFromSqlWriteToCSV(query, tableName,csvFileName, header);
        }
    }
}

/*******************************************************************************
@   Name     :  getTableHeader
@Description :  获取数据表字段-表头
@    Author  :  Hebbe
@ Arguments  :
*               query
*               tableName      数据表名称
*               header         数据表表头
@ Returns    :  bool
********************************************************************************/
bool getTableHeader(QSqlQuery &query, const QString &tableName, QString &header)
{
    header.clear();
    QString str = QString("PRAGMA table_info('%1')").arg(tableName);
    query.prepare(str);
    if (query.exec())
    {
        while (query.next())
        {
            header += query.value(1).toString();
//            qDebug()<<"qqqqq.....:"<<query.value(0).toString()<<","<<query.value(1).toString()<<","<<query.value(2).toString();
            header += ",";
        }
        header += "\\n";
        return true;
    }else{
        qDebug() << query.lastError();
        return false;
    }
}

/*******************************************************************************
@   Name     :  readAllDataFromSqlWriteToCSV
@Description :  从数据库读取数据并生成CSV文件
@    Author  :  Hebbe
@ Arguments  :
*               query
*               tableName      数据表名称
*               csvFileName    CSV文件名称
*               header         数据表表头
@ Returns    :  bool
********************************************************************************/
void readAllDataFromSqlWriteToCSV(QSqlQuery &query, const QString &tableName, const QString &csvFileName, QString header)
{
    //两种方式均可
    #if 1
    if(csvFileName.isEmpty())
       return;

     QFile file(csvFileName);
     //打开.csv文件
     if(!file.open(QIODevice::WriteOnly))
     {
         qDebug() << "Open failed -> " << file.fileName();
         return;
     }

     QByteArray head = header.toLocal8Bit();
     QTextCodec::setCodecForLocale(QTextCodec::codecForName("GB2312"));
     file.write(head.data());
     QString sql ="select * from " + tableName;
     query.prepare(sql);
     if(query.exec(sql))
     {
         QSqlRecord sqlRecord = query.record();
         while(query.next())
         {
             QString strString;
             QByteArray rowData;
             for(int i = 0;i < sqlRecord.count(); i++)
             {
                 QString value = query.value(i).toString();
                 if(value.contains(","))
                 {
                     value.replace(",",";");
                     strString += value + ", ";
                 }
                 else
                 {
                     strString += query.value(i).toString() + ", ";
                 }
             }
             strString +=  " \\n";
             rowData = strString.toLocal8Bit();
             file.write(rowData.data());
         }
     }
     else
     {
         qDebug()<<"get data failure:"<<query.lastError()<<"\\n"<<sql;
     }
     file.close();
     QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
    #else
    if(csvFileName.isEmpty())
      return;

    QFile file(csvFileName);
    //打开.csv文件
    if(!file.open(QIODevice::WriteOnly))
    {
        qDebug() << "Open failed -> " << file.fileName();
        return;
    }
    QTextStream out(&file);
    out.setCodec("GB2312");
    out << header;
    QString sql ="select * from " + tableName;
    query.prepare(sql);
    if(query.exec(sql))
    {
        QSqlRecord sqlRecord = query.record();
        while(query.next())
        {
            QString strString;
            for(int i = 0;i < sqlRecord.count(); i++)
            {
                QString value = query.value(i).toString();
                if(value.contains(","))
                {
                    value.replace(",",";");
                    strString += value + ", ";
                }
                else
                {
                    strString += query.value(i).toString() + ", ";
                }
            }
            strString +=  " \\n";
            out<<strString;
        }
    }
    else
    {
        qDebug()<<"get data failure:"<<query.lastError()<<"\\n"<<sql;
    }
     file.close();
    #endif
}

 

 

2.mysql 数据库

mysql安装成功后可以看到已经存在mysql、information_schema和test这个几个数据库。

information_schema库中有一个名为COLUMNS的表,这个表中记录了数据库中所有表的字段信息。

知道这个表后,获取任意表的字段就只需要一条select语句即可。例如:

select COLUMN_NAME from information_schema.COLUMNS where table_name = 'your_table_name'; 

上述的做法有一点问题,如果多个数据库中存在你想要查询的表名,那么查询的结果会包括全部的字段信息。

通过DESC information_schema.COLUMNS可以看到该表中列名为TABLE_SCHEMA是记录数据库名,因此下面的写法更为严格:

select COLUMN_NAME from information_schema.COLUMNS where table_name = 'your_table_name' and table_schema = 'your_db_name'; 

取字段注释

Select COLUMN_NAME 列名, DATA_TYPE 字段类型, COLUMN_COMMENT 字段注释  
from INFORMATION_SCHEMA.COLUMNS  
Where table_name = 'companies'  ##表名  
AND table_schema = 'testhuicard'##数据库名  
AND column_name LIKE 'c_name'   ##字段名 

以上是关于获取数据库表中所有的字段-Qt的主要内容,如果未能解决你的问题,请参考以下文章

从 2 个不同片段的 sqlite 中的 2 个表中获取信息

SQLSERVER如何获取一个数据库中的所有表的名称一个表中所有字段的名称

使用 PHP 选择并显示 MySQL 表中的所有字段以获取无限量的列

是否可以使用 GraphQLList 从多个表中获取数据

QT内省机制自定义Model数据库

c# Excel 数据透视表中的折叠字段