Qt5連接數據庫常見問題及解決

建立並打開數據庫

QSqlDatabase database;
database = QSqlDatabase::addDatabase("QSQLITE");
database.setDatabaseName("MyDataBase.db");
if (!database.open())
{
	qDebug() << "Error: Failed to connect database." << database.lastError();
}
else
{
 	qDebug() << "Succeed to connect database." ;
}

創建表

QSqlQuery sql_query;
    if(!sql_query.exec("create table allfilesdata(  \
                       fileid INTEGER primary key AUTOINCREMENT,    \
                       filename text UNIQUE,  \
                       filepath  text NOT NULL, \
                       filesize INTEGER, \
                       fileattributes INTEGER NOT NULL, \
                       creat_dwlowtime INTEGER NOT NULL,    \
                       creat_dwhightime INTEGER NOT NULL,   \
                       lastaccess_dwlowtime INTEGER NOT NULL,   \
                       lastaccess_dwhightime INTEGER NOT NULL,  \
                       lastwrite_dwlowtime INTEGER NOT NULL,    \
                       lastwrite_dwhightime INTEGER NOT NULL)"))
    {
        qDebug() << "Error: Fail to create table."<< sql_query.lastError();
    }
    else
    {
        qDebug() << "Table created!";
    }

插入數據

QSqlQuery sql_query;
sql_query.prepare("INSERT INTO allfilesdata(filename,filepath,filesize,fileattributes,creat_dwlowtime,creat_dwhightime,lastaccess_dwlowtime,lastaccess_dwhightime,lastwrite_dwlowtime,lastwrite_dwhightime) VALUES(:filename,:filepath,:filesize,:fileattributes,:creat_dwlowtime,:creat_dwhightime,:lastaccess_dwlowtime,:lastaccess_dwhightime,:lastwrite_dwlowtime,:lastwrite_dwhightime)");
sql_query.bindValue(":filename",QString::fromStdWString(fd.cFileName));
sql_query.bindValue(":filepath",QString::fromStdWString(folder));
sql_query.bindValue(":filesize",(int)(fd.nFileSizeHigh*(MAXDWORD + 1) + fd.nFileSizeLow));
sql_query.bindValue(":fileattributes",(int)fd.dwFileAttributes);
sql_query.bindValue(":creat_dwlowtime",(int)fd.ftCreationTime.dwLowDateTime);
sql_query.bindValue(":creat_dwhightime",(int)fd.ftCreationTime.dwHighDateTime);
sql_query.bindValue(":lastaccess_dwlowtime",(int)fd.ftLastAccessTime.dwLowDateTime);
sql_query.bindValue(":lastaccess_dwhightime",(int)fd.ftLastAccessTime.dwHighDateTime);
sql_query.bindValue(":lastwrite_dwlowtime",(int)fd.ftLastWriteTime.dwLowDateTime);
sql_query.bindValue(":lastwrite_dwhightime",(int)fd.ftLastWriteTime.dwHighDateTime);
if(!sql_query.exec())
{
	qDebug() << sql_query.lastError();
}
else
{
    qDebug() << "inserted data successfully!";
}

佔位符

QSqlQuery sql_query;
QString searchstr="select * from allfilesdata where filename LIKE :linetext";
sql_query.prepare(searchstr);
sql_query.bindValue(":linetext",QString("%%1%").arg(linetext));

注意,LIKE子句中使用到的百分號(%)不是在SQL字符串中出現的,而是在綁定佔位符的值的時候出現的,而且LIKE子句在SQL字符串中不能使用單引號(’),因爲佔位符的類型就是字符串,所以就不需要在LIKE子句中再使用單引號(’)了

轉義字符

sqlite裏的單引號轉義不是用反斜槓’/‘而是用單引號,就是在單引號前再加一個單引號(’’)

Qt連接Sqlite使用事務批量插入數據

方法一,批處理方式:

dbT1.transaction(); //開始啓動事務
inQry.prepare("insert into datatable values (?,?,?)");
while (!ReadDat.atEnd()) {
	strTextData = ReadDat.readLine();
    listIndex << datIndex;
    tmStamp << tmStampCnt;
    dtData << strTextData;
    datIndex++;
    DatWin->append(strTextData);
}
//綁定數據,順序應與表結構字段數據一致
inQry.addBindValue(listIndex); //綁定數據
inQry.addBindValue(tmStamp); //綁定數據
inQry.addBindValue(dtData); //綁定數據
inQry.execBatch(); //進行批處理操作
dbT1.commit(); //提交事務,此時打開數據庫文件執行SQL語句

//不加下面三句,重複操作上面語句時,數據庫不會有新的添加
//因爲作爲主鍵的listIndex內有原數據,此時數據庫不會保存主鍵值重複的內容
listIndex.clear();
tmStamp.clear();
dtData.clear();

方法二,佔位符方式:

dbT1.transaction();
while(!ReadDat.atEnd())
{
	strTextData = ReadDat.readLine();
	inQry.prepare("insert into datatable(tIndex, tTimStamp, tDistance) values(:tIndex, :tTimStamp, :tDistance)");
	inQry.bindValue(0,datIndex);
	inQry.bindValue(1,tmStampCnt);
	inQry.bindValue(2,strTextData);
	inQry.exec();
	datIndex++;
	DatWin->append(strTextData);
}
dbT1.commit();

Qt5連接mysql數據庫時報錯

QSqlDatabase: QMYSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE QMYSQL QMYSQL3 QODBC QODBC3 QPSQL QPSQL7
QSqlQuery::prepare: database not open

報錯原因1:缺少libmysql.dll
解決辦法:將 MySQL目錄下\MySQL Server 5.5\lib\libmysql.dll複製到項目編譯目錄

報錯原因2:服務器未開啓mysql
解決辦法:systemctr start mysqld.service (centos7)

報錯原因3:服務器未關閉防火牆
解決辦法:systemctr stop firewalld.service (centos7)

發佈了10 篇原創文章 · 獲贊 0 · 訪問量 2641
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章