首先在pro文件里面添加.QT += core gui sql
然后创建连接:
bool MainWindow:: connect(const QString &dbName)
{
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setDatabaseName(dbName);//数据库的名字,这里是Test(注意这里的数据库名字实际上是workbench里面的数据库连接名)
db.setHostName("127.0.0.1");//ip地址
db.setUserName("root");//用户的名字
db.setPassword("19931218");//密码
db.setPort(3306);
qDebug()<<"success";
if (!db.open())
{
QMessageBox::critical(0, QObject::tr("Database Error"), db.lastError().text());
return false;
}
return true;
}
由于使用的是MySQL数据库,所以需要指定数据库的名字,登陆的用户名,密码,以及ip地址.adddatabase()函数返回一个数据库连接,由于没有使用connectionname这个参数,系统会自动生成一个名字为defaultConnection的连接.
[1]:然后创建一个QSqlQuery类,注意这里的QSqlQuery实例的创建。我们并没有指定是为哪一个数据库连接创建查询对象,此时,系统会使用默认的连接,也就是使用没有第二个参数的addDatabase()函数创建的那个连接(其实就是名字为QSqlDatabase::defaultConnection的默认连接)。如果没有这么一个连接,系统就会报错。也就是说,如果没有默认连接,我们在创建QSqlQuery对象时必须指明是哪一个QSqlDatabase对象,也就是addDatabase()的返回值。
利用这个类创建表单以及插入数据,读取数据.因为表单不能重复创建,所以在创建之前我们先删除表单,然后再创建.其中使用了addBindValue来绑定,替换站占位符.
#include "mainwindow.h"
#include"QSqlQuery"
#include "QSqlError"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
if ( w.connect("test"))
{
QSqlQuery query;
qDebug()<<"hhhh" ;
//query.exec("TRUNCATE TABLE");
query.exec("DROP TABLE student");
if (!query.exec("CREATE TABLE student ("
"ID CHAR(10) not null,"
"name CHAR(100) not null,"
"age CHAR(10) not null"
");"))
{
QMessageBox::critical(0, QObject::tr("Database Error"), query.lastError().text());
return 1;
}
else
qDebug()<<"success";
query.prepare("INSERT INTO student (name, age) VALUES (?, ?)");
QVariantList names;
names << "Tom" << "Jack" << "Jane" << "Jerry";
query.addBindValue(names);
QVariantList ages;
ages << 20 << 23 << 22 << 25;
query.addBindValue(ages);
if (!query.execBatch())
{
QMessageBox::critical(0, QObject::tr("Database Error"), query.lastError().text());
}
query.finish();
qDebug()<<"hhhh" ;
query.exec("SELECT name, age FROM student");
while (query.next())
{
qDebug()<<"start11";
QString name = query.value(0).toString();
int age = query.value(1).toInt();
int Id = query.value(2).toInt();
qDebug() << name << ": " << age<<Id;
}
}
return a.exec();
}
============= 我是分割线==================
QSqlQuery类功能强大,可以执行各种sql语句,但是稍显麻烦,QSqlTableModel则是一个更高级的模型,它足以应付大多数的sql需求.
QSqlTableModel model;
model.setTable("student");//关联到这个student表
model.setFilter("age > 20 and age < 25");//相当于设置where语句
if(model.select())
{
for(int i = 0;i!=model.rowCount();++i)
{
QSqlRecord record = model.record(i);//获取第一行的结果
QString name = record.value("name").toString();
size_t age = record.value("age").toInt();
qDebug()<<"name: "<<name<<"age: "<<age;
}
和QSqlQuery类一样,如果在创建model的时候没有指定连接,就会自动关联到默认的连接上去,没有这个默认连接就会报错.注意,model的select不能选择某些列,只能全部选择.
[3]接下来是插入语句:
int row = 0; model.insertRows(row, 1); //在position row 插入 count empty rows
model.setData(model.index(row, 1), "Cheng");//在这一行设置数据
model.setData(model.index(row, 2), 24);//同上
model.submitAll();
相当于INSERT INTO student (name, age) VALUES (‘Cheng’, 24) .
[4]更新数据表:
if (model.select())
{
if (model.rowCount() == 1)
{
model.setData(model.index(0, 2), 26);
model.submitAll();
}
}
[5]删除数据表:
QSqlTableModel model;
model.setTable("student");
model.setFilter("age = 25");
if (model.select()) {
if (model.rowCount() == 1)
{ model.removeRows(0, 1); //Removes count rows starting at row.
model.submitAll();
}
}