QT QSqlQuery QSqlQueryModel

來源:互聯網
上載者:User

標籤:des   style   blog   http   color   使用   os   io   

 
SQL執行操作

QSqlQuery提供了對資料庫記錄的Select、Insert、Update、Delete操作。

SELECT操作:

 

QSqlQuery query;

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(),定位任意一條記錄的位置。

列數、欄位數:query.record().count()   

行數,記錄數 query.size();

sql="SELECT * FROM sys";

            query.exec(sql);

     
            rec=query.record();
            int numRows;
            while (query.next())
            {
                if (db.driver()->hasFeature(QSqlDriver::QuerySize))
                {
                //驅動支援返回記錄數
                numRows = query.size();
                }
                else
                {
                  //驅動不支援返回記錄數,只能迴圈尋找
                 query.last();
                 numRows = query.at() + 1;
                }
            }

 

值:query.value(0)

INSERT操作:

 

//單一插入資料

QSqlQuery query;

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;

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

QVariantList ints;

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

query.addBindValue(ints);

QVariantList names;

names << "Harald" << "Boris" << "Trond" << QVariant(QVariant::String);

query.addBindValue(names);

if (!query.execBatch())

qDebug() << query.lastError();

 

UPDATE操作:

 

QSqlQuery query;

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

query.bindValue(0, 70000);

query.exe();

 

DELETE操作:

 

QSqlQuery query;

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

 

交易處理:

 

QSqlDatabase::database().transaction();

QSqlQuery query;

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

"VALUES (201, ‘Manhattan Project‘, "

+ QString::number(employeeId) + ")");

}

QSqlDatabase::database().commit();

 

如果資料庫引擎支援交易處理,則函數QSqlDriver::hasFeature(QSqlDriver::Transactions)將返回 真。

可以通過調用QSqlDatabase::transaction()來初始化一個交易處理。之後執行你想在該交易處理的工作。

完了再執行QSqlDatabase::commit()來提交交易處理或QSqlDatabase::rollback()取消交易處理。

這裡在舉個QSqlDriver::hasFeature(QSqlDriver::QuerySize)例子,可以較快的統計查詢記錄行數。

QSqlQuery query;

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 {

// this can be very slow

query.last();

numRows = query.at() + 1;

}

 

預存程序:

AsciiToInt()是資料庫中的一個預存程序。

但我在網上以前好像看過說是SQL Server中的預存程序是通過"EXEC"完成的,而不是"CALL",這裡我不確定!留下一個疑問吧~

 

QSqlQuery query;

query.prepare("CALL AsciiToInt(?, ?)");

query.bindValue(0, "A");

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

int rowNum = query.at();
        //擷取query所指向的記錄在結果集中的編號
        int columnNum = query.record().count();
//擷取每條記錄中屬性(即列)的個數
        int fieldNo = query.record().indexOf("name");
//擷取"name"屬性所在列的編號,列從左向右編號,最左邊的編號為0
        int id = query.value(0).toInt();
//擷取id屬性的值,並轉換為int型
       QString name = query.value(fieldNo).toString();
//擷取name屬性的值

http://www.cnblogs.com/bennylam/archive/2010/03/30/1700761.html

 

 

QT操作資料庫

2.完全解決資料庫儲存中文和Qt程式顯示資料庫中文及中文字串的問題 
(1)資料庫和表及表裡的字元相關欄位(varchar, char, text等)都要使用gbk_chinese_ci這種方式,不這樣做也能,但這樣做,會省非常多麻煩。 
(2)重新編譯Qt的MySQL驅動,需要修改src / sql / drivers / mysql / qsql_mysql.cpp檔案。要修改的部分如下:第一百零八行的codec函數   
static QTextCodec* codec(MYSQL* mysql) 
{ 
return QTextCodec::codecForName("GBK");//增加部分 
#if MYSQL_VERSION_ID >= 32321 
   QTextCodec* heuristicCodec = QTextCodec :: codecForName ( mysql_character_set_name ( mysql ) ); 
if (heuristicCodec) 
   return heuristicCodec; 
#endif 
return QTextCodec::codecForLocale(); 
} 
(3)然後,重新編譯qt的mysql驅動在Qt程式main函數中app後面開頭處加入下面三句,加上這三個是省得不必要的麻煩   
QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK")); 
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GBK")); 
QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK")); 
(4)在Qt資料庫連接後,運行"SET NAMES ’UTF8’"語句或"SET NAMES ’GBK’"。   
db = QSqlDatabase::addDatabase("QMYSQL"); 
db.setHostName("localhost"); 
db.setDatabaseName("yourdatabase"); 
db.setUserName("yourusername"); 
db.setPassword("yourpassword"); 
db.open(); 
db.exec("SET NAMES ’UTF8’"); 

經過以上四步,就能在Qt程式中直接使用中文字串,而且能直接使用中文字串出入於程式和資料庫之間 
3.串連MySql資料庫 
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); 
db.setHostName("localhost"); 
db.setDatabaseName("test"); 
db.setUserName("root"); 
db.setPassword("******"); 
bool ok = db.open();

連結QSLite資料庫:

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); 
4.SELECT操作 
QSqlQuery query; 
int numRows; 
query.exec("SELECT * FROM scores ORDER BY id ASC"); 
while (query.next()) 
{ 
QString name = query.value(0).toString();//query.value()的參數只能是index 
int salary = query.value(1).toInt(); 
label = setText(QString::number(salary)+name);//測試查詢資料的行數 
if (db.driver()->hasFeature(QSqlDriver::QuerySize)) 
{ 
   numRows = query.size(); 
} 
else 
{ 
   // this can be very slow 
   query.last(); 
   numRows = query.at() + 1; 
} 
} 
5.INSERT操作 
(1)直接插入(一條記錄) 
QSqlQuery query; 
query.exec("INSERT INTO employee (id, name, salary) VALUES (1001, ’Thad Beaumont’, 65000)"); 
(2)通過“:欄位”操作 
QSqlQuery query; 
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(); 
(3)通過“?”操作 
QSqlQuery query; 
query.prepare("INSERT INTO employee (id, name, salary) VALUES (?, ?, ?)"); 
query.addBindValue(1001); 
query.addBindValue("Thad Beaumont"); 
query.addBindValue(65000); 
query.exec(); 
6.UPDATE操作
 
QSqlQuery query; 
query.exec("UPDATE employee SET salary = 70000 WHERE id = 1003"); 
7.DELETE操作
 
QSqlQuery query; 
query.exec("DELETE FROM employee WHERE id = 1007"); 
8.transaction()操作 
有時為了執行一系列複雜的操作,使用QSqlDatabase::transaction()能加快速度 
//database為QSqlDatabase對象 
if(database.driver()->hasFeature(QSqlDriver::Transactions)) //測試資料庫是否支援Transactions, 
{ 
database.transaction(); 
query.exec("SELECT name FROM scores WHERE id=19"); 
if(query.next()) 
{ 
      //str = query.value(0).toString(); 
      str = "中國"; 
      query.exec("INSERT INTO scores(name) VALUES(’"+str+"’)"); 
} 
database.commit(); 
} 
注意,如果str為中文字串,在SQL語句中需要標明’str’(用單引號括起),如果是英文或數字字串,能不加單引號(指的是包含在雙引號內的SQL語句) 
9.使用SQL Model類 
QSqlQueryModel——一個唯讀讀取資料庫資料的模型 
QSqlTableModel——一個可讀寫的單一表格模型,能不用寫SQL語句 
QSqlRelationalTableModel——QSqlTableModel的一個子類 
這些類都繼承於QAbstractTableModel,而他們又都繼承於QAbstractItemModel 
(1) QSqlQueryModel的使用
 
QSqlQueryModel querymodel; 
querymodel.setQuery("SELECT * FROM scores ORDER BY id ASC"); 
for (num=0;numquerymodel.rowCount();num++) 
{ 
str += QString::number(querymodel.record(num).value("id").toInt()); 
str += " "; 
str += querymodel.record(num).value("name").toString(); 
//注意這裡的value()參數能是index(索引)也能是欄位名,前面QSqlQuery的value()參數只能是index 
str += "\n"; 
} 
label->setText(str); 
(2) QSqlTableModel的使用 
① 讀取資料
 
QSqlTableModel tablemodel;

tablemodel.setTable("scores"); 
tablemodel.setFilter("id > 10"); 
tablemodel.setSort(0,Qt::DescendingOrder); 
tablemodel.select(); 
for (num=0;numtablemodel.rowCount();num++) 
{ 
str += QString::number(tablemodel.record(num).value("id").toInt()); 
str += " "; 
str += tablemodel.record(num).value(1).toString(); 
str += "\n"; 
} 
label->setText(str); 
② 修改資料 
QSqlTableModel tablemodel; 
tablemodel.setTable("scores"); 
tablemodel.setFilter("id > 10"); 
tablemodel.setSort(0,Qt::DescendingOrder); 
tablemodel.select(); 
for (num=0;numtablemodel.rowCount();num++) 
{ 
QSqlRecord record = tablemodel.record(num); 
record.setValue("name",record.value("name").toString()+"2"); 
tablemodel.setRecord(num,record);
 
} 
if(tablemodel.submitAll()) 
label->setText("修改成功!"); 
else 
label->setText("修改失敗!"); 
或能用setData()來修改,代碼如下: 
QSqlTableModel tablemodel; 
tablemodel.setTable("scores"); 
tablemodel.setFilter("id > 10"); 
tablemodel.setSort(0,Qt::DescendingOrder); 
tablemodel.select(); 
tablemodel.setData(tablemodel.index(2,1),"data修改"); 
if(tablemodel.submitAll()) 
    label->setText("修改成功!"); 
else 
    label->setText("修改失敗!"); 
③ 刪除資料 
tablemodel.removeRows(row, 5);
 
//removeRows()第一個參數為要刪除的第一行的行數,第二個參數為要刪除的總行數; 
tablemodel.submitAll(); 
//注意,利用QSqlTableModel修改或刪除資料,最後都要使用submitAll()執行更改 
④ 插入資料
 
QSqlRecord record = tablemodel.record(); 
record.setValue("name","插入的"); 
tablemodel.insertRecord(2,record);
 
//注意,此處插入利用insertRecord()函數,該函數第一個參數為插入到tablemodel的第幾行,第二個參數為記錄,注意這裡的記錄一 定要和tablemodel中的記錄匹配,故QSqlRecord record = tablemodel.record();另外,插入操作不用submitAll(),因為,insertRecord()返回bool值。 
10.使用QTableView 
開頭處要使用#include 
QTableView *view = new QTableView(); 
view->setModel(&model); 
view->setEditTriggers(QAbstractItemView::NoEditTriggers); 
view->show();

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.