Qt 中QTableView控件调用sql简单整理
1.建立公共方法
private:
QSqlDatabase m_db;
1)打开数据库
void SqlToolWnd::onInitDBConn()
{
m_db = QSqlDatabase::addDatabase("QSQLITE");
m_db.setDatabaseName("sfclient.db");
if(!m_db.open())
{
qDebug() << "Error: Failed to connect database." << m_db.lastError();
}
}
2.关闭数据库
void SqlToolWnd::ExitConn()
{
m_db.close();
}
3.创建数据表
void SqlToolWnd::on_createPushButton_clicked()
{
onInitDBConn();
QSqlQuery sql_query;
if(!sql_query.exec("create table student(id int primary key, name text, sex text)"))
{
qDebug() << "Error: Fail to create table."<< sql_query.lastError();
}
else
{
qDebug() << "Table created!";
}
ExitConn();
}
4.增加数据记录
void SqlToolWnd::on_addPushButton_clicked()
{
onInitDBConn();
QSqlTableModel *model = new QSqlTableModel(this);
model->setTable(QString::fromLocal8Bit("学生表"));
model->select();
int row = model->rowCount();
model->insertRows(row,1);
model->setData(model->index(row,0),"1900010105003");
model->setData(model->index(row,1),QString::fromLocal8Bit("刘备"));
model->setData(model->index(row,2),QString::fromLocal8Bit("男"));
model->setData(model->index(row,3),"1886-02-20");
model->setData(model->index(row,4),QString::fromLocal8Bit("军事应用系"));
model->setData(model->index(row,5),QString::fromLocal8Bit("军事管理科学"));
model->setData(model->index(row,6),"01");
model->submitAll();
ui->tableView->setModel(model);
ExitConn();
}
5.删除数据
void SqlToolWnd::on_deletePushButton_clicked()
{
onInitDBConn();
QSqlTableModel *model = new QSqlTableModel(this);
model->setTable(QString::fromLocal8Bit("学生表"));
SqlParamDlg paramDlg;
if(QDialog::Accepted == paramDlg.exec())
{
if(!paramDlg.m_param.isEmpty())
{
QString sParam = QString(QString::fromLocal8Bit("学生表.'学号'='%1'")).arg(paramDlg.m_param);
qDebug()<<sParam;
model->setFilter(sParam);
model->select();
if(model->rowCount()==1)
{
model->removeRows(0,1);
model->submitAll();
}
}
else
{
QString sParam = QString::fromLocal8Bit("学生表.'性别'='男'");
qDebug()<<sParam;
model->setFilter(sParam);
model->select();
if(model->rowCount()>0)
{
model->removeRows(0,model->rowCount());
model->submitAll();
}
}
}
else
{
ExitConn();
return;
}
ui->tableView->setModel(model);
ExitConn();
}
6.修改数据表记录
void SqlToolWnd::on_modifyPushButton_clicked()
{
onInitDBConn();
QSqlTableModel *model = new QSqlTableModel(this);
model->setTable(QString::fromLocal8Bit("学生表"));
SqlParamDlg paramDlg;
if(QDialog::Accepted == paramDlg.exec())
{
if(!paramDlg.m_param.isEmpty())
{
QString sParam = QString(QString::fromLocal8Bit("学生表.'学号'='%1'")).arg(paramDlg.m_param);
qDebug()<<sParam;
model->setFilter(sParam);
model->select();
if(model->rowCount()==1)
{
QSqlRecord record = model->record(0);
record.setValue(QString::fromLocal8Bit("姓名"),QString::fromLocal8Bit("夏侯惇"));
model->setRecord(0,record);
model->submitAll();
}
}
}
else
{
ExitConn();
return;
}
ui->tableView->setModel(model);
ExitConn();
}
7.查询数据表记录
void SqlToolWnd::on_SelectPushButton_clicked()
{
onInitDBConn();
QSqlTableModel *model = new QSqlTableModel(this);
model->setTable(QString::fromLocal8Bit("学生表"));
SqlParamDlg paramDlg;
if(QDialog::Accepted == paramDlg.exec())
{
if(!paramDlg.m_param.isEmpty())
{
QString sParam = QString(QString::fromLocal8Bit("学生表.'姓名'='%1'")).arg(paramDlg.m_param);
qDebug()<<sParam;
model->setFilter(sParam);
}
else
{
model->setFilter("");
}
}
else
{
ExitConn();
return;
}
model->select();
ui->tableView->setModel(model);
ExitConn();
}
说明:QTableView控件提供了方便访问sql接口,本文只是简单写了多种方案的一种,简便了sql的操作。
方案一:利用QSqlQuery构造函数操作数据库
QSqlQuery query;
query.exec("select Name, Salary FROM Employee where Salary > 1000");
while (query.next())
{
QString Name = query.value(0).toString();
int Salary = query.value(1).toInt();
qDebug() << Name << Salary;
}
方案二:利用QSqlQuery与prepare,bindValue
QSqlQuery query;
query.prepare("INSERT INTO employee (id, name, salary) " "VALUES (:id, :name, :salary)");
query.bindValue(":id", 10001);
query.bindValue(":name", "Tom");
query.bindValue(":salary", 8500);
query.exec();
方案三:利用QSqlQuery与prepare,addBindValue
QSqlQuery query;
query.prepare("INSERT INTO employee (id, name, salary) " "VALUES (:id, :name, :salary)");
query.addBindValue(10001);
query.addBindValue("Tom");
query.addBindValue(8500);
query.exec();
方案四:QSqlQueryModel与setQuery,setHeaderData操作数据表
QSqlQueryModel *model = new QSqlQueryModel(ui->tableView);
model->setQuery("select * from student");
model->setHeaderData(0,Qt::Horizontal,QObject::tr("name"));
model->setHeaderData(1,Qt::Horizontal,QObject::tr("score"));
ui->tableView->setModel(model);