| 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屬性的值
|