QT開發(四十八)——數據庫SQL接口層

QT開發(四十八)——數據庫SQL接口層

    SQL接口層提供了對數據庫的訪問,主要類包括Qt SQL模塊中的QSqlDatabaseQSqlQueryQSqlErrorQSqlFieldQSqlIndexQSqlRecordQSqlDatabase類用於建立數據庫鏈接,QSqlQuery用於使用SQL語句實現與數據庫交互。html

1、QSqlDatabase

1QSqlDatabase簡介

QSqlDatabase類提供了經過鏈接訪問數據庫的接口,QSqlDatabase對象自己表明一個鏈接,鏈接經過QT支持的數據庫驅動提供對數據庫的訪問。sql

2QSqlDatabase成員函數

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

返回鏈接的用戶名

2、QSqlQuery

1QSqlQuery簡介

    QSqlQuery類提供了執行、操做SQL語句的一種手段。QSqlQuery封裝了涉及建立、導航和經過鏈接執行SQL查詢語句獲取數據的功能。QSqlQuery能用於執行DML語句(如SELECTINSERTUPDATEDELETE)和DDL語句(如CREATE TABLE),也可以用於執行非標準SQL的特定數據庫的命令(如PostgreSQL語句:SET DATESTYLE=ISO)。

    執行SQL語句成功會設置QSqlQuery對象的狀態爲活躍,不然設置爲非活躍。不管哪一種狀況,當執行一條新的SQL語句時,查詢都被定位在一條無效的記錄上。在數據被獲取前,一個活躍的查詢必須被導航到一條有效的記錄上。

2QSqlQuery成員函數

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的字段的值

3、操做結果集

使用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();

3、QSqlRecord

1QSqlRecord簡介

    QSqlRecord封裝了數據庫記錄的功能和特性,支持增長和刪除字段以及設置和獲取字段值。

    記錄的字段的值能夠由名字和位置使用setValue函數設置。若是將字段社會中爲空,使用setNull函數。經過字段名字使用indexOf函數能夠找到字段的位置。經過特定的位置使用fieldName函數能夠找到字段名字。使用field()函數獲取給定字段的QSqlField對象。

2QSqlRecord成員函數

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

4、QSqlField

1QSqlField簡介

    QSqlField用於操做SQL數據庫中表和視圖的字段。

    QSqlField表明數據庫中表和視圖中一列的特性,如數據類型和列名。字段也包含數據庫中列中的值。字段的數據值存儲在QVariant變量中,使用不兼容的數據類型是不容許的。

    QSqlField對象不多在應用程序代碼中顯示建立,一般經過包含字段鏈表的QSqlRecord對象直接訪問。

    QSqlField對象能提供字段的不少元數據,如字段的名字、數據類型、長度、精度、默認值等。

2QSqlField成員函數

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

返回字段的值

5、QSqlIndex

1QSqlIndex簡介

    QSqlIndex類提供了操做和描述數據庫索引的函數。

2QSqlIndex成員函數

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)

desctrue時,索引i的字段按降序存儲

6、QSqlError

1QSqlError簡介

QSqlError類提供類SQL數據的錯誤信息。QSqlError對象可以提供數據庫具體的錯誤數據。

2QSqlError成員函數

QSqlError::QSqlError(const QString &driverText = QString(), const QString &databaseText = QString(), ErrorType type = NoError, const QString &code = QString())

構造一個包含驅動錯誤文本driverText、數據庫具體錯誤文本databaseText、類型type和錯誤碼codeQSqlError對象

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

返回錯誤類型

相關文章
相關標籤/搜索