SQL接口層提供了對數據庫的訪問,主要類包括Qt SQL模塊中的QSqlDatabase、QSqlQuery、QSqlError、QSqlField、QSqlIndex和QSqlRecord。QSqlDatabase類用於建立數據庫鏈接,QSqlQuery用於使用SQL語句實現與數據庫交互。html
QSqlDatabase類提供了經過鏈接訪問數據庫的接口,QSqlDatabase對象自己表明一個鏈接,鏈接經過QT支持的數據庫驅動提供對數據庫的訪問。sql
QSqlDatabase::QSqlDatabase(const QSqlDatabase &other)數據庫
[protected] QSqlDatabase::QSqlDatabase(const QString &type)app
[protected] QSqlDatabase::QSqlDatabase(QSqlDriver *driver)框架
使用給定的驅動建立一個數據庫鏈接ide
[static] QSqlDatabase QSqlDatabase::addDatabase(const QString &type, const QString &connectionName = QLatin1String( defaultConnection ))函數
根據給定的數據庫驅動類型type、數據庫鏈接名connectionName 建立一個數據庫鏈接,若是有已經存在的同名鏈接,則新創建鏈接替換舊鏈接;若是沒有指定數據庫鏈接名,則新創建的數據庫鏈接將成爲應用程序的默認鏈接。spa
[static] QSqlDatabase QSqlDatabase::addDatabase(QSqlDriver *driver, const QString &connectionName = QLatin1String( defaultConnection ))code
根據給定的數據庫驅動driver、鏈接名connectionName 建立數據庫鏈接htm
[static] QSqlDatabase QSqlDatabase::cloneDatabase(const QSqlDatabase &other, const QString &connectionName)
根據數據庫鏈接other克隆建立一個名字爲connectionName的數據庫鏈接
void QSqlDatabase::close()
關閉數據庫鏈接,釋放申請的任何資源,數據庫使用的任何QSqlQuery對象將無效
bool QSqlDatabase::commit()
若是數據庫驅動支持事務機制而且已經啓動,提交事務給數據庫。對於某些數據庫,若是有一個使用數據庫的活躍查詢SELECT,提交將會失敗,返回false。在提交前須要確保查詢不在活躍。
QString QSqlDatabase::connectOptions() const
返回鏈接選項使用的字符串
QString QSqlDatabase::connectionName() const
返回鏈接名
[static] QStringList QSqlDatabase::connectionNames()
返回包含全部鏈接的名字的鏈表
[static] bool QSqlDatabase::contains(const QString &connectionName = QLatin1String( defaultConnection ))
若是數據庫鏈接的鏈表中包含connectionName 鏈接,返回true
[static] QSqlDatabase QSqlDatabase::database(const QString &connectionName = QLatin1String( defaultConnection ), bool open = true)
返回名字爲connectionName 的數據庫鏈接。數據庫鏈接需事先添加,若是open爲true,而且數據庫鏈接沒有打開,則調用本函數時打開鏈接。若是connectionName沒有指定,返回默認的連接;若是connectionName不存在數據庫鏈表中,返回非法的連接
QString QSqlDatabase::databaseName() const
返回鏈接的數據庫名字
QSqlDriver *QSqlDatabase::driver() const
返回用於數據庫鏈接訪問的數據庫驅動
QString QSqlDatabase::driverName() const
返回鏈接的驅動名字
[static] QStringList QSqlDatabase::drivers()
返回全部可用的數據庫驅動的鏈表
QSqlQuery QSqlDatabase::exec(const QString &query = QString()) const
在數據庫執行一條SQL語句query,返回QSqlQuery對象
QString QSqlDatabase::hostName() const
返回鏈接的主機名
[static] bool QSqlDatabase::isDriverAvailable(const QString &name)
若是驅動name可用,返回true
bool QSqlDatabase::isOpen() const
若是數據庫鏈接目前打開,返回true
bool QSqlDatabase::isOpenError() const
若是在打開數據庫鏈接時發生錯誤,返回true
bool QSqlDatabase::isValid() const
若是QSqlDatabase鏈接有一個合法的驅動,返回true
QSqlError QSqlDatabase::lastError() const
返回數據庫發生的最後一個錯誤的信息
QSql::NumericalPrecisionPolicy QSqlDatabase::numericalPrecisionPolicy() const
返回數據庫鏈接當前的默認精度策略
bool QSqlDatabase::open()
使用當前的鏈接值打開數據庫鏈接
bool QSqlDatabase::open(const QString &user, const QString &password)
使用給定的用戶名和密碼打開數據庫鏈接
QString QSqlDatabase::password() const
返回數據庫鏈接的密碼
int QSqlDatabase::port() const
返回數據庫鏈接的端口號
QSqlRecord QSqlDatabase::record(const QString &tablename) const
返回表tablename中全部字段的名字的記錄
[static] void QSqlDatabase::registerSqlDriver(const QString &name, QSqlDriverCreatorBase *creator)
在SQL框架內註冊新的名字爲name的SQL驅動
[static] void QSqlDatabase::removeDatabase(const QString &connectionName)
從數據庫鏈接鏈表中刪除名字爲connectionName的數據庫鏈接
bool QSqlDatabase::rollback()
停止數據庫上的一件事務
void QSqlDatabase::setConnectOptions(const QString &options = QString())
設置數據庫指定選項,必須在鏈接打開以前或是鏈接失效時完成
void QSqlDatabase::setDatabaseName(const QString &name)
設置鏈接的數據庫名字爲name,爲了生效,必須在鏈接被打開前設置。
void QSqlDatabase::setHostName(const QString &host)
設置鏈接的主機名爲host,爲了生效,必須在鏈接被打開前設置。
void QSqlDatabase::setNumericalPrecisionPolicy(QSql::NumericalPrecisionPolicy precisionPolicy)
在建立的數據庫鏈接上設置默認的數字精度策略,用於查詢。在當前活躍的查詢上設置將無效
void QSqlDatabase::setPassword(const QString &password)
設置鏈接的密碼,須要在鏈接打開前設置
void QSqlDatabase::setPort(int port)
設置鏈接的端口號,須要在鏈接打開前設置
void QSqlDatabase::setUserName(const QString &name)
設置鏈接的用戶名,須要在鏈接打開前設置
QStringList QSqlDatabase::tables(QSql::TableType type = QSql::Tables) const
返回由type指定的數據庫的表、系統表和視圖的鏈表
bool QSqlDatabase::transaction()
若是數據庫驅動支持事務機制,在數據庫上開始一個事務
QString QSqlDatabase::userName() const
返回鏈接的用戶名
QSqlQuery類提供了執行、操做SQL語句的一種手段。QSqlQuery封裝了涉及建立、導航和經過鏈接執行SQL查詢語句獲取數據的功能。QSqlQuery能用於執行DML語句(如SELECT、INSERT、UPDATE、DELETE)和DDL語句(如CREATE TABLE),也可以用於執行非標準SQL的特定數據庫的命令(如PostgreSQL語句:SET DATESTYLE=ISO)。
執行SQL語句成功會設置QSqlQuery對象的狀態爲活躍,不然設置爲非活躍。不管哪一種狀況,當執行一條新的SQL語句時,查詢都被定位在一條無效的記錄上。在數據被獲取前,一個活躍的查詢必須被導航到一條有效的記錄上。
QSqlQuery::QSqlQuery(QSqlResult *result)
使用result構建一個QSqlQuery對象
QSqlQuery::QSqlQuery(const QString &query = QString(), QSqlDatabase db = QSqlDatabase())
使用SQL語句query、數據庫db構建一個QSqlQuery對象,若是數據庫db爲指定、非法,使用應用程序默認的數據庫
QSqlQuery::QSqlQuery(QSqlDatabase db)
QSqlQuery::QSqlQuery(const QSqlQuery &other)
void QSqlQuery::addBindValue(const QVariant &val, QSql::ParamType paramType = QSql::In)
當使用位置值綁定時,增長val到值鏈表中
int QSqlQuery::at() const
返回查詢的當前內部位置
void QSqlQuery::bindValue(const QString &placeholder, const QVariant &val, QSql::ParamType paramType = QSql::In)
將值val綁定到佔位符placeholder
void QSqlQuery::bindValue(int pos, const QVariant &val, QSql::ParamType paramType = QSql::In)
QVariant QSqlQuery::boundValue(const QString &placeholder) const
QVariant QSqlQuery::boundValue(int pos) const
QMap<QString, QVariant> QSqlQuery::boundValues() const
void QSqlQuery::clear()
清除結果集,釋放查詢佔用的任何資源。設置查詢狀態到非活躍
const QSqlDriver *QSqlQuery::driver() const
返回查詢關聯的數據庫的驅動
bool QSqlQuery::exec(const QString &query)
執行SQL語句query,查詢執行成功時,返回true,設置查詢爲活躍狀態
在查詢執行後,查詢定位在一個無效的記錄上,在獲取數據值前必須把查詢移動到有效的記錄上。對於SQLite數據庫,query字符串每次只能包含一條語句。
bool QSqlQuery::exec()
執行一條事先準備的SQL語句
bool QSqlQuery::execBatch(BatchExecutionMode mode = ValuesAsRows)
批處理執行事先準備的SQL查詢語句
QString QSqlQuery::executedQuery() const
返回最後成功執行的查詢語句
bool QSqlQuery::first()
若是結果集可用,查詢的位置在獲取記錄的查詢上,則獲取結果集中的第一條記錄
bool QSqlQuery::isActive() const
若是查詢處於活躍狀態,返回true
bool QSqlQuery::isSelect() const
若是當前查詢是一條SELECT語句,返回true
bool QSqlQuery::isValid() const
若是查詢的當前定位在有效的記錄上,返回true
QSqlError QSqlQuery::lastError() const
返回查詢發生的最後一次錯誤的錯誤信息
bool QSqlQuery::next()
若是查詢可用,而且定位在獲取的記錄上,獲取結果中的下一條記錄
bool QSqlQuery::prepare(const QString &query)
事先準備要執行的SQL語句
bool QSqlQuery::previous()
若是查詢可用,而且定位在獲取的記錄上,則獲取結果中的前一條記錄
QSqlRecord QSqlQuery::record() const
返回當前查詢的包含字段信息的一條記錄
QVariant QSqlQuery::value(int index) const
返回當前記錄中index字段的值
QVariant QSqlQuery::value(const QString &name) const
返回當前記錄中字段名爲name的字段的值
使用QSqlQuery對象執行SQL語句查詢操做獲得的全部記錄是一個結果集,QSqlQuery類提供了多個函數來處理獲得的結果集。一般結果集中的記錄從0開始。
bool seek(int index, bool relative = false)query指向結果集的第n條記錄
bool first()query指向結果集的第一條記錄
bool last()query指向結果集的最後一條記錄
bool next()query指向下一條記錄,每執行一次函數,便指向相鄰的下一條記錄
bool previous()query指向上一條記錄,每執行一次函數,便指向相鄰的上一條記錄
QSqlRecord record() const得到如今指向的記錄
QVariant value(int index) const得到記錄中第n個屬性的值
int at() const得到如今query指向的記錄在結果集中的編號
執行完query.exec("select *from student");代碼時,query是指向結果集外的,能夠利用query.next()使得query指向結果集的第一條記錄。也能夠利用seek(0)函數或者first()函數使query指向結果集的第一條記錄。爲了節省內存開銷,推薦的方法是,在query.exec("select * from student");代碼前加上query.setForwardOnly(true);代碼,此後只能使用next()和seek()函數。
query.exec("select * from student");
query.next();
QString name = query.value(1).toString();
qDebug() << name;
query.first();
name = query.value(1).toString();
qDebug() << name;
經過對結果集的記錄的逐條遍歷,能夠操做數據庫中的數據項。
當要進行多條記錄的操做時,能夠利用綁定進行批處理。
QSqlQuery query;
query.prepare("insert into student values (?, ?)");
QVariantList ints;
ints << 10 << 11 << 12 << 13;
query.addBindValue(ints);
QVariantList names;
names << "xiaoming" << "xiaoliang"
<< "xiaogang" << QVariant(QVariant::String);
query.addBindValue(names);
if (!query.execBatch())
qDebug() << query.lastError();
事務能夠保證一個複雜操做的原子性。在QT中,若是底層的數據庫引擎支持事務,那麼QSqlDriver::hasFeature(QSqlDriver::Transactions)會返回true。可使用QSqlDatabase::transaction()來啓動一個事務,而後編寫一些但願在事務中執行的SQL語句,最後調用QSqlDatabase::commit()或者QSqlDatabase::rollback()。當使用事務時必須在建立查詢之前就開始事務。
QSqlDatabase::database().transaction();
QSqlQuery query1;
query1.exec("select * from student");
query1.next();
QString name = query1.value(1).toString();
qDebug() << name;
query1.first();
name = query1.value(1).toString();
qDebug() << name;
QSqlDatabase::database().commit();
QSqlRecord封裝了數據庫記錄的功能和特性,支持增長和刪除字段以及設置和獲取字段值。
記錄的字段的值能夠由名字和位置使用setValue函數設置。若是將字段社會中爲空,使用setNull函數。經過字段名字使用indexOf函數能夠找到字段的位置。經過特定的位置使用fieldName函數能夠找到字段名字。使用field()函數獲取給定字段的QSqlField對象。
QSqlRecord::QSqlRecord()
QSqlRecord::QSqlRecord(const QSqlRecord &other)
構造函數
void QSqlRecord::append(const QSqlField &field)
在記錄尾部增長一個字段field
void QSqlRecord::clear()
刪除記錄的全部字段
void QSqlRecord::clearValues()
清除記錄中全部字段的值並設置爲空
bool QSqlRecord::contains(const QString &name) const
若是記錄中包含name字段,返回true
int QSqlRecord::count() const
返回記錄中的字段的數量
QSqlField QSqlRecord::field(int index) const
返回記錄中位置爲index的字段,若是index超出範圍,返回默認構造值
QSqlField QSqlRecord::field(const QString &name) const
返回記錄中字段名爲name的字段
QString QSqlRecord::fieldName(int index) const
返回記錄中位置爲index的字段的名字
int QSqlRecord::indexOf(const QString &name) const
返回記錄中字段名字爲name的字段的位置,沒有此字段則返回-1,字段名大小寫不敏感,有多個匹配則返回第一個匹配的
void QSqlRecord::insert(int pos, const QSqlField &field)
在記錄中的位置pos插入字段field
bool QSqlRecord::isEmpty() const
記錄中的無字段,返回true
void QSqlRecord::remove(int pos)
返回記錄中位置爲pos的字段
void QSqlRecord::replace(int pos, const QSqlField &field)
使用給定字段field替換記錄中的位置爲pos的字段
void QSqlRecord::setValue(int index, const QVariant &val)
設置記錄中位置爲index的字段的值爲val
void QSqlRecord::setValue(const QString &name, const QVariant &val)
設置記錄中名字爲name的字段的值爲val
QVariant QSqlRecord::value(int index) const
返回記錄中位置爲index的字段的值
QVariant QSqlRecord::value(const QString &name) const
返回記錄中字段名爲name的字段的值
void QSqlRecord::setNull(const QString &name)
設置記錄中字段名爲name的字段的值爲null
void QSqlRecord::setNull(int index)
設置記錄中位置爲index的字段的值爲null
QSqlField用於操做SQL數據庫中表和視圖的字段。
QSqlField表明數據庫中表和視圖中一列的特性,如數據類型和列名。字段也包含數據庫中列中的值。字段的數據值存儲在QVariant變量中,使用不兼容的數據類型是不容許的。
QSqlField對象不多在應用程序代碼中顯示建立,一般經過包含字段鏈表的QSqlRecord對象直接訪問。
QSqlField對象能提供字段的不少元數據,如字段的名字、數據類型、長度、精度、默認值等。
QSqlField::QSqlField(const QString &fieldName = QString(), QVariant::Type type = QVariant::Invalid)
構造一個名字爲fieldName、數據類型爲type的空字段
QSqlField::QSqlField(const QSqlField &other)
void QSqlField::clear()
清除字段的值並設置爲空
QVariant QSqlField::defaultValue() const
返回字段的默認值
bool QSqlField::isAutoValue() const
若是字段的值字段生成,返回true。如主鍵的值自動增長
bool QSqlField::isNull() const
若是字段的值爲null,返回true
bool QSqlField::isReadOnly() const
若是字段的值爲只讀類型,返回true
bool QSqlField::isValid() const
若是字段的變量類型合法,返回true
int QSqlField::length() const
返回字段的長度
QString QSqlField::name() const
返回字段的名字
int QSqlField::precision() const
返回字段的精度,只在數字類型時有意義
void QSqlField::setAutoValue(bool autoVal)
autoVal爲真時設置字段的值自動生成
void QSqlField::setDefaultValue(const QVariant &value)
設置字段中默認的值爲value
void QSqlField::setLength(int fieldLength)
設置字段的長度爲fieldLength
void QSqlField::setName(const QString &name)
設置字段名爲name
void QSqlField::setPrecision(int precision)
設置字段精度爲precision,只對數字字段有效
void QSqlField::setReadOnly(bool readOnly)
設置字段值的只讀標識爲readOnly。
void QSqlField::setType(QVariant::Type type)
設置字段的數據變量類型爲type
void QSqlField::setValue(const QVariant &value)
設置字段的值爲value
QVariant::Type QSqlField::type() const
返回存儲在數據中的字段的數據類型
QVariant QSqlField::value() const
返回字段的值
QSqlIndex類提供了操做和描述數據庫索引的函數。
QSqlIndex::QSqlIndex(const QString &cursorname = QString(), const QString &name = QString())
QSqlIndex::QSqlIndex(const QSqlIndex &other)
構造函數
void QSqlIndex::append(const QSqlField &field)
追加一個字段field到字段鏈表中,默認按升序排序
void QSqlIndex::append(const QSqlField &field, bool desc)
void QSqlIndex::setName(const QString &name)
設置索引的名字爲name
void QSqlIndex::setDescending(int i, bool desc)
desc爲true時,索引i的字段按降序存儲
QSqlError類提供類SQL數據的錯誤信息。QSqlError對象可以提供數據庫具體的錯誤數據。
QSqlError::QSqlError(const QString &driverText = QString(), const QString &databaseText = QString(), ErrorType type = NoError, const QString &code = QString())
構造一個包含驅動錯誤文本driverText、數據庫具體錯誤文本databaseText、類型type和錯誤碼code的QSqlError對象
QSqlError::QSqlError(const QSqlError &other)
QString QSqlError::databaseText() const
返回數據庫報告的錯誤文本
QString QSqlError::driverText() const
返回數據庫驅動報告的錯誤文本
bool QSqlError::isValid() const
若是設置了錯誤,返回true
QString QSqlError::nativeErrorCode() const
返回數據庫具體錯誤碼
ErrorType QSqlError::type() const
返回錯誤類型