QT数据库QSqlQuery(转)


微信 分享:

SQL执行操作

QSqlQuery提供了对数据库记录的选择,插入,更新,删除操作。

SELECT操作:

QSqlQuery查询;

query.exec(“SELECT name,salary FROM employee WHERE salary> 50000”);

while(query.next()){

    QString name = query.value(0).toString();

    int salary = query.value(1).toInt();

    qDebug()<< name << salary;

}}

通过QSqlQuery :: next(),QSqlQuery :: previous(),QSqlQuery :: first(),QSqlQuery :: last(),QSqlQuery :: seek(),可以得到下一条,上一条,第一条,最后一条,任意一条记录的位置。

INSERT操作:

//单一插入数据

QSqlQuery查询;

query.prepare(“INSERT INTO employee(id,name,salary)”

                        “VALUES(:id,:name,:salary)”);

query.bindValue(“:id”,1001);

query.bindValue(“:name”,“Thad Beaumont”);

query.bindValue(“:salary”,65000);

query.exec();

//批量插入数据

QSqlQuery查询;

query.prepare(“insert into myTable values(?,?)”);

QVariantList ints;

ints << 1 << 2 << 3 << 4;

query.addBindValue(ints);

QVariantList名称;

名称<<“Harald”<<“Boris”<<“Trond”<< QVariant(QVariant :: String);

query.addBindValue(names);

if(!query.execBatch())

    qDebug()<< query.lastError();

UPDATE操作:

QSqlQuery查询;

query.prepare(“UPDATE employee SET salary =?WHERE id = 1003”);

query.bindValue(0,70000);

query.exe();

DELETE操作:

QSqlQuery查询;

query.exec(“DELETE FROM employee WHERE id = 1007”);

事务处理:

QSqlDatabase :: database()。transaction();

QSqlQuery查询;

query.exec(“SELECT id FROM employee WHERE name ='Torild Halvorsen'”);

if(query.next()){

    int employeeId = query.value(0).toInt();

    query.exec(“INSERT INTO project(id,name,ownerid)”

                       “值(201,'曼哈顿计划',”

                       + QString :: number(employeeId)+“)”);

}}

QSqlDatabase :: database()。commit();

如果数据库引擎支持事务处理,则函数QSqlDriver :: hasFeature(QSqlDriver :: Transactions)将返回真。

可以通过调用QSqlDatabase :: transaction()来初始化一个事务处理。之后执行你想在该事务处理的工作。

完成再执行QSqlDatabase :: commit()来提交事务处理或QSqlDatabase :: rollback()取消事务处理。

这里在举个QSqlDriver :: hasFeature(QSqlDriver :: QuerySize)例子,可以较快的统计查询记录行数。

QSqlQuery查询;

int numRows;

query.exec(“SELECT name,salary FROM employee WHERE salary> 50000”);

QSqlDatabase defaultDB = QSqlDatabase :: database();

if(defaultDB.driver() - > hasFeature(QSqlDriver :: QuerySize)){

    numRows = query.size();

} else {

     //这可能很慢

     query.last();

     numRows = query.at()+ 1;

}}

存储过程:

asciiToInt()是数据库中的一个存储过程。

但我在网上以前好像看过说SQL Server中的存储过程是通过“EXEC”完成的,而不是“CALL”,这里我不确定!留下一个疑问吧〜

QSqlQuery查询;

query.prepare(“ CALL AsciiToInt(?,)”);

query.bindValue(0,“A”);

query.bindValue(1,0,QSql :: Out);

query.exec();

int i = query.boundValue(1).toInt(); // i是65

■,使用SQL模型类

QSqlQueryModel:一个只读的读取数据库数据的模型。

QSqlTableModel:一个可读写的单一表格模型,可以不用写SQL语句。

QSqlRelationalTableModel:QSqlTableModel的一个子类,可多表关联在一起。

这些类都继承于QAbstractTableModel,而它们又又都继承于QAbstractItemModel。

QSqlQueryModel只读模式,基于SQL查询基础。

QSqlQueryModel模型;

model.setQuery(“SELECT * FROM employee”);

for(int i = 0; i <model.rowCount(); ++ i){

    int id = model.record(i).value(“id”)。toInt();

    QString name = model.record(i).value(“name”)。toString();

    qDebug()<< id << name;

}}

QSqlTableModel可以对单表操作,进行读写操作。

//读取数据

QSqlTableModel模型;

model.setTable(“employee”);

model.setFilter(“salary> 50000”);

model.setSort(2,Qt :: DescendingOrder);

model.select();

for(int i = 0; i <model.rowCount(); ++ i){

    QString name = model.record(i).value(“name”)。toString();

    int salary = model.record(i).value(“salary”)。toInt();

    qDebug()<< name << salary;

}}

//通过QSqlTableModel :: setRecord()修改数据

for(int i = 0; i <model.rowCount(); ++ i){

    QSqlRecord record = model.record(i);

    double salary = record.value(“salary”)。toInt();

    薪金* = 1.1;

    record.setValue(“salary”,salary);

    model.setRecord(i,record);

}}

model.submitAll();

//通过QSqlTableModel :: setData()来更新一条记录

model.setData(model.index(row,column),75000);

model.submitAll();

// insert一条记录

model.insertRows(row,1);

model.setData(model.index(row,0),1013);

model.setData(model.index(row,1),“Peter Gordon”);

model.setData(model.index(row,2),68500);

model.submitAll();

// delete一条记录

model.removeRows(row,5);

model.submitAll();

函数QSqlTableModel :: submitAll()确保记录写入数据库中。

QSqlRelationalTableModel通过外键实现了多表关联。

// employee表中关联城表

model-> setTable(“employee”);

model-> setRelation(2,QSqlRelation(“city”,“id”,“name”));

model-> setRelation(3,QSqlRelation(“country”,“id”,“name”));

■,数据呈现视图中

QSqlQueryModel,QSqlTableModel,QSqlRelationalTableModel一般都是借助QListView,QTableView,QTreeView吧数据呈现出来的〜

QSqlRelationalTableModel模型;

model-> setTable(“employee”);

model-> setRelation(2,QSqlRelation(“city”,“id”,“name”));

model-> setRelation(3,QSqlRelation(“country”,“id”,“name”));

//设置标题头部标签信息

model-> setHeaderData(0,Qt :: Horizo​​ntal,QObject :: tr(“ID”));

model-> setHeaderData(1,Qt :: Horizo​​ntal,QObject :: tr(“Name”));

model-> setHeaderData(2,Qt :: Horizo​​ntal,QObject :: tr(“City”));

model-> setHeaderData(3,Qt :: Horizo​​ntal,QObject :: tr(“Country”));

//值得注意的是,在查询时应该明确指明那个表的数据信息,以下两种方式是等价的。

model.setFilter(tr(“city.name ='%1'”)。arg(“Mucich”));

//model.setFilter(training"employee.cityid =%1“)。arg(312));

model.select();

//借助QTableView,把数据信息显示出来,

QTableView * view = new QTableView;

view-> setModel(model);

//将表中的项,设计为不能编辑模式

view-> setEditTriggers(QAbstractItemView :: NoEditTriggers);

view-> show();

在讲一种通过QSqlField进行插入,更新,删除的操作。上边的例子,继续〜

QSqlField idField(“id”,QVariant :: Int);

QSqlField nameField(“name”; QVariant :: String);

QSqlField cityIdField(“cityId”,QVariant :: Int);

QSqlField countryIdField(“countryId”,QVariant :: Int);

//一条记录Id = 12,Name = vic.MINg,City = ShenYang,Country = China。(沉阳区号024,中国086)

idField.setValue(12);

nameField.setValue(“vic.MINg”);

cityIdField.setValue(24);

countryIdField.setValue(86);

// insert一条记录,-1表示在最尾端加入

QSqlRecord记录;

record.append(idField);

record.append(nameField);

record.append(cityIdField);

record.append(countryIdField);

model-> insertRecord(-1,record);

// update一条记录,row表示要修改的行

QSqlRecord record = model-> record(row);

record.replace(1,nameField);

record.replace(2,cityIdField);

record.replace(3,countryIdField);

model-> setRecord(row,record);

// delete一条记录,row表示要修改的行

model-> removeRow(row);

■,数据呈现窗体中

通过QDataWidgetMapper可以在窗体控制与数据库中的记录关联在一起。

QDataWidgetMapper * mapper = new QDataWidgetMapper;

mapper-> setModel(model);

mapper-> addMapping(idSpinBox,0);

mapper-> addMapping(nameLineEdit,1);

mapper-> addMapping(cityComboBox,2);

mapper-> addMapping(countryComboBox,3);

//可以通过toFirst(),toNext(),toPrevious(),toLast(),setCurrentIndex()来设置当前记录位置,显示相应数据

mapper-> toFirst();

//信号,槽的机制模型,view,mapper三个联系再一起

connect(view-> selectionModel(),SIGNAL(currentRowChanged(QModelIndex,QModelIndex)),

        mapper,SLOT(setCurrentModelIndex(QModelIndex)));

©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页