Qt中常用的數據庫操作

簡述:

常用的數據庫操作主要有查詢、插入、刪除等

QSqlDatabase創建連接數據庫實例,一個QSqlDatabase的實例代表一個數據庫的連接。

Qt 提供了對不同數據庫的驅動支持:

Driver Type Description
QDB2 IBM DB2
QIBASE Borland InterBase Driver
QMYSQL MySQL Driver
QOCI Oracle Call Interface Driver
QODBC  ODBC Driver (includes Microsoft SQL Server)
QPSQL PostgreSQL Driver
QSQLITE SQLite version 3 or above
QSQLITE2 SQLite version 2
QTDS Sybase Adaptive Server

 

1、創建連接數據庫

 

/**
 * @brief initDb
 * 創建Db
 * @return
 */
bool initDb()
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", "project");  
    db.setHostName("localhost");  //數據庫主機名   
    db.setDatabaseName("myDb");   //數據庫名   
    db.setUserName("hebbe");      //數據庫用戶名   
    db.setPassword("123456");      //數據庫密碼   
    //db.open();          //打開數據庫連接  調用 open() 方法打開數據庫物理連接。在打開連接之前,連接不可用
    //db.close();         //釋放數據庫連接
    // create connection
    if (!db.open())
    {
        qDebug() << "Sqlite open fail" << endl;
        return false;
    }
    return true;
}

 

2、創建表

 

/**
 * @brief createTable
 * 創建表
 * @return
 */
bool createTable()
{
    QSqlQuery query(db);
    QString cmd,cmd2;
    quint16 num;
    QString info, msg, info_other, msg_other;
    QStringList list;
    cmd = QString("CREATE TABLE IF NOT EXISTS tb_Error ("
                  "ErrorNo INTEGER  NOT NULL PRIMARY KEY,"
                  "ErrorDetaInfo VARCHAR(255) NULL,"
                  "ErrorDetaInfo_En VARCHAR(255) NULL,"
                  "ErrorMesages VARCHAR(255) NULL,"
                  "ErrorMesages_En VARCHAR(255) NULL);"
                  );
    if(!query.exec(cmd))
    {
        qDebug()<<"init tb_error errot"<<query.lastError();
    }

    if(query.exec("select count(1) from tb_Error"))
    {
        if(query.next())
        {
            if(query.value(0).toInt() == 0)
            {
                // 讀取錯誤信息插入數據庫
                QFile file("./error.ini");
                if(!file.open(QIODevice::ReadOnly))
                {

                }
                QTextStream stream(&file);
                QString line;
                do
                {
                    list.clear();
                    line = stream.readLine();
                    list = line.split("|");
                    if(list.count() == 5)
                    {
                        num = list.at(0).toUInt();
                        info = list.at(1);
                        msg = list.at(2);
                        info_other = list.at(3);
                        msg_other = list.at(4);

                        qDebug()<<"num = "<<num<<"info = "<<info<<"msg = "<<msg;
                        cmd2 = QString("INSERT INTO tb_Error(ErrorNo,ErrorDetaInfo,ErrorMesages,ErrorDetaInfo_En,ErrorMesages_En)VALUES(%1, \"%2\", \"%3\", \"%4\", \"%5\")")
                                .arg(num).arg(info).arg(msg).arg(info_other).arg(msg_other);
                        if(!query.exec(cmd2))
                        {
                            qDebug()<<"num = "<<num<<"info = "<<info<<"msg = "<<msg;
                            qDebug()<<"initError = "<<query.lastError();
//                            return false;
                        }
                    }
//                    qDebug()<<"inser to database msg"<<line;
                }
                while(!line.isNull());
                file.close();
            }
        }
    }
    return true;
}

 

3、獲取列

/**
 * @brief getColumn
 * 獲取列
 * @return
 */
int getColumn(const QString &tableName,QString item, QString itemStr)
{
      QSqlQuery query(db);
      QString sql;
      sql = QString("select * from %1 WHERE %2 = '%3' ").arg(tableName).arg(item).arg(itemStr);
      query.prepare(sql);
      if(query.exec(sql))
      {
          QSqlRecord sqlRecord = query.record();
          return sqlRecord.count();
      }
      else
      {
          qDebug()<<"get data failure:"<<query.lastError()<<"\n"<<sql;
      }
      return 0;
}

 

4、獲取行

 

/**
 * @brief getRow
 * 獲取列
 * @return
 */
int getRow(const QString &tableName,QString item, QString itemStr)
{
      QSqlQuery query(db);
      QString sql;
      sql = QString("select COUNT() from %1 ").arg(tableName);
      query.prepare(sql);
      if(query.exec(sql))
      {
          return query.value(0).toInt() ;
      }
      else
      {
          qDebug()<<"get data failure:"<<query.lastError()<<"\n"<<sql;
      }
      return 0;
}

 

5、獲取最大值

 

/**
 * @brief getMaxDateTime
 * 獲取列
 * @return
 */
QDateTime getMaxDateTime(const QString &tableName)
{
      QSqlQuery query(db);
      QString sql;
      sql = QString("select MAX(DateTime) from %1 ").arg(tableName);
      query.prepare(sql);
      if(query.exec(sql))
      {
          return query.value(0).toDateTime();
      }
      else
      {
          qDebug()<<"get data failure:"<<query.lastError()<<"\n"<<sql;
          return QDateTime::currentDateTime(); 
      }
}

 

6、獲取最小值

 

/**
 * @brief getMinDateTime
 * 獲取列
 * @return
 */
QDateTime getMinDateTime(const QString &tableName)
{
      QSqlQuery query(db);
      QString sql;
      sql = QString("select MIN(DateTime) from %1 ").arg(tableName);
      query.prepare(sql);
      if(query.exec(sql))
      {
          return query.value(0).toDateTime();
      }
      else
      {
          qDebug()<<"get data failure:"<<query.lastError()<<"\n"<<sql;
          return QDateTime::currentDateTime(); 
      }
}

 

7、查詢所有記錄

 

/**
 * @brief selectAllData
 * 獲取所有數據
 * @return
 */
void selectAllData(const QString &tableName)
{
    QSqlQuery query = QSqlQuery(db);   
    QString sql;
    sql = QString("select * from %1 ").arg(tableName);
    query.prepare(sql);
    query.exec();
     while (query.next()) //依次取出查詢結果的每一條記錄,直至結束
     {
         qDebug()<<query.value(0).toInt();
         qDebug()<<query.value(1).toString();   
     }  
}

 

8、獲取數據並分頁顯示到QTableView

 

int total;              //總記錄數
int pageSize;           //每頁顯示條數
int totalPage;          //總頁數
int startPage;          //起始頁
QSqlQueryModel  *sqlQueryModel;
#define PAGE_SIZE       50

void init()
{
    sqlQueryModel = new QSqlQueryModel(this);
    QSqlQuery query(db);
    ui->tableView->setModel(sqlQueryModel);
    pageSize = PAGE_SIZE;
    query.exec(QString("SELECT COUNT() FROM tb_Diagnose"));
    while(query.next())
    {
        total = query.value(0).toInt();
    }
    if(total <= PAGE_SIZE)
        totalPage = 1;
    else
        totalPage = (total%pageSize == 0)? (total/pageSize):(total/pageSize+1);
    if(startPage > totalPage)
    {
        startPage = totalPage;
    }
}

/**
 * @brief selectAndShowData
 * 從數據庫獲取數據,並在QTableView顯示
 *
 * @return
 */
void selectAndShowData()
{
    QSqlQuery query(db);
    QString cmd;    
    if(startPage < totalPage) {
        cmd = QString("SELECT * FROM ( SELECT * FROM table limit %3, %4 ) a  ORDER BY DateTime DESC ")
                .arg(total-(startPage*pageSize)).arg(pageSize);
    } else if(startPage == totalPage) {
        cmd = QString("SELECT * FROM ( SELECT * FROM table limit 0, %3 ) a ORDER BY DateTime DESC ")
                .arg(total-(startPage-1)*pageSize);
    }
    if(!query.exec(cmd))
    {
        qDebug()<<query.lastError();
    }
    sqlQueryModel->setQuery(query);
    while(sqlQueryModel->canFetchMore())
        sqlQueryModel->fetchMore();

    ui->labelTitle->setText(tr("Log"));
    ui->labelFooter->setText(tr("Page: %1/%2").arg(startPage).arg(totalPage)); 
    sqlQueryModel->setHeaderData(0, Qt::Horizontal, tr("No."));
    sqlQueryModel->setHeaderData(1, Qt::Horizontal, tr("ID"));
    sqlQueryModel->setHeaderData(2, Qt::Horizontal, tr("Name"));
    sqlQueryModel->setHeaderData(3, Qt::Horizontal, tr("Date/time"));
    sqlQueryModel->setHeaderData(4, Qt::Horizontal, tr("Details"));
    ui->tableView->setColumnWidth(0, 55);
    ui->tableView->setColumnWidth(1, 150);
    ui->tableView->setColumnWidth(2, 100);
    ui->tableView->setColumnWidth(3, 255);
    ui->tableView->setColumnWidth(4, ui->tableView->width()-55-100-150-255-ui->tableView->verticalScrollBar()->width());

}

 

9、插入數據

 

/**
 * @brief insertData
 * 插入數據
 * @return
 */
bool insertData(QSqlQuery &query, quint64 rcNum, QString operatorId, QString describeStr)
{
    QString cmd;
    cmd = QString("INSERT INTO table(RcNum, DateTime, OperatorID, Operation) VALUES(%1, datetime('now'), '%2', \"%3\") ")
            .arg(rcNum)
            .arg(operatorId)
            .arg(describeStr);
    if(!query.exec(cmd))
    {
        qDebug()<<"INSERT table Error:"<<query.lastError()<<endl<<cmd;
        return false;
    }
    else
        return true;
}

 

10、更新數據

/**
 * @brief updateData
 * 更新數據
 * @return
 */
bool updateData(QSqlQuery &query, quint64 rcNum, QString describeStr)
{
    QString cmd;
    cmd = QString("update table set Operation = '%1' where RcNum = %2")
            .arg(describeStr)
            .arg(rcNum);
    if(!query.exec(cmd))
    {
        qDebug()<<"update table Error:"<<query.lastError()<<endl<<cmd;
        return false;
    }
    else
        return true;
}

 

11、刪除

 

/**
 * @brief deleteData
 * 刪除數據
 * @return
 */
bool deleteData(QSqlQuery &query, quint64 rcNum)
{
    QString cmd;
    cmd = QString("delete from table where  where RcNum = %1")
            .arg(rcNum);
    if(!query.exec(cmd))
    {
        qDebug()<<"delete table Error:"<<query.lastError()<<endl<<cmd;
        return false;
    }
    else
        return true;
}


/**
 * @brief deleteAllData
 * 刪除所有數據
 * @return
 */
bool deleteAllData(QSqlQuery &query)
{
    QString cmd;
    cmd = QString("delete from table");
    if(!query.exec(cmd))
    {
        qDebug()<<"delete table Error:"<<query.lastError()<<endl<<cmd;
        return false;
    }
    else
        return true;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章