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 :: Horizontal,QObject :: tr(“ID”));
model-> setHeaderData(1,Qt :: Horizontal,QObject :: tr(“Name”));
model-> setHeaderData(2,Qt :: Horizontal,QObject :: tr(“City”));
model-> setHeaderData(3,Qt :: Horizontal,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)));
|