1、效果示範
1)增删改查效果
2)資料庫内容
2、建立資料庫及表格
2.1 建立資料庫
首先在.pro檔案添加對sql的支援:QT += core gui sql
領Qt資料→點選「連結」
QString g_connectName = "mySQL_connection";
bool MainWindow::createDatabase()
{
//檢測已連接配接的方式 - 自定義連接配接名
if(QSqlDatabase::contains(g_connectName))
{
m_Projdb = QSqlDatabase::database(g_connectName);
}
else
{
m_Projdb = QSqlDatabase::addDatabase("QSQLITE",g_connectName);
//設定資料庫路徑
QString sDir = QApplication::applicationDirPath();
QString sDataPath = sDir + "/mySql.db";
m_Projdb.setDatabaseName(sDataPath);
}
//打開資料庫
if(!m_Projdb.open())
{
QMessageBox::information(this,"提示","資料庫建立失敗,無法打開!");
return false;
}
// 建立表格
createImageTable();
//關閉資料庫
m_Projdb.close();
return true;
}
2.2 建立資料庫表格
bool MainWindow::createImageTable()
{
…………………………
//如果不存在則建立my_table表,id自增,name唯一
const QString cmdSql = R"(
CREATE TABLE IF NOT EXISTS image_table (
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
imagename TEXT NOT NULL,
type CHAR(50) NOT NULL,
notes TEXT,
imagedata BLOB NOT NULL
);)";
//QSqlQuery構造前,需要db已打開并連接配接;未指定db或者db無效時使用預設連接配接進行操作
QSqlQuery myQuery(m_Projdb);
if(!myQuery.exec(cmdSql))
{
QString sError = myQuery.lastError().text();
sError = "資料庫表格插入資料失敗:" + sError;
QMessageBox::information(this,"提示",sError);
m_Projdb.close();
return false;
}
…………………………
return true;
}
3、增删改查
3.1 增加記錄
void MainWindow::on_pushBtn_add_clicked()
{
QString strImag = ui->lineEdit_file->text();
QFileInfo fileInfo(strImag);
………………
QString sName = fileInfo.fileName();
QString sType = fileInfo.suffix();
QString strNote = ui->plainTextEdit_add->toPlainText();
if(ImageFileExist(sName))
{
QMessageBox::information(this,"提示","圖檔檔案已經存在!");
return;
}
//将資料轉換為QByteArray類型存儲到資料庫中
QFile* pFile = new QFile(strImag);
pFile->open(QIODevice::ReadOnly);
QByteArray imageData = pFile->readAll();
pFile->fileName();
pFile->close();
if(!m_Projdb.open())
{
QMessageBox::information(this,"提示","資料庫無法打開!");
return;
}
//QSqlQuery構造前,需要db已打開并連接配接;未指定db或者db無效時使用預設連接配接進行操作
QSqlQuery myQuery(m_Projdb);
QString cmdSql = "insert into image_table(imagename,type,notes,imagedata) values( '%1','%2','%3',:imagedata)";
cmdSql = QString(cmdSql).arg(sName).arg(sType).arg(strNote);
qDebug() << cmdSql;
myQuery.prepare(cmdSql);
myQuery.bindValue(":imagedata",imageData);
if(!myQuery.exec())
{
QString sError = myQuery.lastError().text();
sError = "資料庫表格插入資料失敗:" + sError;
QMessageBox::information(this,"提示",sError);
m_Projdb.close();
return;
}
QMessageBox::information(this,"提示","添加成功!");
m_Projdb.close();
// 重新整理界面
…………………………
}
3.2 删除記錄
void MainWindow::on_pushBtn_del_clicked()
{
…………………………
//QSqlQuery構造前,需要db已打開并連接配接;未指定db或者db無效時使用預設連接配接進行操作
QSqlQuery myQuery(m_Projdb);
QString cmdSql = "DELETE from image_table where imagename = '%1'";
cmdSql = QString(cmdSql).arg(sFileName);
qDebug() << cmdSql;
if(!myQuery.exec(cmdSql))
{
QString sError = myQuery.lastError().text();
sError = "資料庫表格删除資料失敗:" + sError;
QMessageBox::information(this,"提示",sError);
m_Projdb.close();
return;
}
…………………………
// 重新整理界面
………………………………
}
3.3 修改記錄
void MainWindow::on_pushBtn_modify_clicked()
{
……………………
QString sNote = dlg.GetNoteString();
QSqlQuery myQuery(m_Projdb);
QString cmdSql = "UPDATE image_table SET notes = '%2' where imagename = '%1'";
cmdSql = QString(cmdSql).arg(sFileName).arg(sNote);
…………………………
// 重新整理界面
…………………………
}
3.4 查找記錄
void MainWindow::on_pushBtn_preview_clicked()
{
………………………………
//QSqlQuery構造前,需要db已打開并連接配接;未指定db或者db無效時使用預設連接配接進行操作
QSqlQuery myQuery(m_Projdb);
QString cmdSql = "select * from image_table where imagename = '%1'";
cmdSql = QString(cmdSql).arg(sFileName);
qDebug() << cmdSql;
if(!myQuery.exec(cmdSql))
{
QString sError = myQuery.lastError().text();
sError = "資料庫表格查詢資料失敗:" + sError;
QMessageBox::information(this,"提示",sError);
m_Projdb.close();
return;
}
while (myQuery.next())
{
QString strFileName = myQuery.value(1).toString();
QString strFileType = myQuery.value(2).toString();
QString strNote = myQuery.value(3).toString();
QByteArray bytes = myQuery.value(4).toByteArray();
QBuffer buffer(&bytes);
buffer.open(QIODevice::ReadOnly);
QImageReader reader(&buffer,strFileType.toLatin1());
QImage img = reader.read();
img.save(strFileName);
break;
}
m_Projdb.close();
}
3.5 周遊表格記錄
bool MainWindow::GetAllImageRecord()
{
………………………………
// 查詢表格資料
const QString cmdSql = R"(SELECT * FROM image_table;)";
//QSqlQuery構造前,需要db已打開并連接配接;未指定db或者db無效時使用預設連接配接進行操作
QSqlQuery myQuery(m_Projdb);
if(!myQuery.exec(cmdSql))
{
QString sError = myQuery.lastError().text();
sError = "資料庫表格插入資料失敗:" + sError;
QMessageBox::information(this,"提示",sError);
m_Projdb.close();
return false;
}
while (myQuery.next())
{
QString sFileName, sFileType,sNotes;
for (int i = 0; i < myQuery.record().count(); i++)
{
QString strFieldName = myQuery.record().fieldName(i);
QVariant value = myQuery.record().value(i);
if(strFieldName == "imagename")
{
QString strValue = value.toString();
sFileName = strValue;
}
if(strFieldName == "type")
{
QString strValue = value.toString();
sFileType = strValue;
}
if(strFieldName == "notes")
{
QString strValue = value.toString();
sNotes = strValue;
}
}
if (!sFileName.isEmpty() && !sFileType.isEmpty())
{
FileInfo fileInfo;
fileInfo.sName = sFileName;
fileInfo.sType = sFileType;
fileInfo.sNotes = sNotes;
m_vecImageFile.push_back(fileInfo);
}
}
…………………………
}