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)));

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章