日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
包含qt4如何讀oracle的詞條

在RedHat5和Qt4.7.3下用oci連接oracle數(shù)據(jù)庫(kù),編譯連接時(shí)提示找不到oci庫(kù)函數(shù)

一般情況是因?yàn)榄h(huán)境變量沒有設(shè)定正確

成都創(chuàng)新互聯(lián)公司公司2013年成立,先為鹿城等服務(wù)建站,鹿城等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為鹿城企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。

LD_LIBRARY_PATH 這個(gè)變量是否增加了oracle的lib

$ORACLE_HOME/lib 前提是你的Oracle_home環(huán)境變量已經(jīng)設(shè)定

用qt怎么備份Oracle數(shù)據(jù)庫(kù)

Qt 提供了 QtSql 模塊來提供平臺(tái)獨(dú)立的基于 SQL 的數(shù)據(jù)庫(kù)操作。這里我們所說的“平臺(tái)獨(dú)立”,既包括操作系統(tǒng)平臺(tái),有包括各個(gè)數(shù)據(jù)庫(kù)平臺(tái)。另外,我們強(qiáng)調(diào)了“基于 SQL”,因?yàn)?NoSQL 數(shù)據(jù)庫(kù)至今沒有一個(gè)通用查詢方法,所以不可能提供一種通用的 NoSQL 數(shù)據(jù)庫(kù)的操作。Qt 的數(shù)據(jù)庫(kù)操作還可以很方便的與 model/view 架構(gòu)進(jìn)行整合。通常來說,我們對(duì)數(shù)據(jù)庫(kù)的操作更多地在于對(duì)數(shù)據(jù)庫(kù)表的操作,而這正是 model/view 架構(gòu)的長(zhǎng)項(xiàng)。

Qt 使用QSqlDatabase表示一個(gè)數(shù)據(jù)庫(kù)連接。更底層上,Qt 使用驅(qū)動(dòng)(drivers)來與不同的數(shù)據(jù)庫(kù) API 進(jìn)行交互。Qt 桌面版本提供了如下幾種驅(qū)動(dòng):

驅(qū)動(dòng) 數(shù)據(jù)庫(kù)

QDB2 IBM DB2 (7.1 或更新版本)

QIBASE Borland InterBase

QMYSQL MySQL

QOCI Oracle Call Interface Driver

QODBC Open Database Connectivity (ODBC) – Microsoft SQL Server 及其它兼容 ODBC 的數(shù)據(jù)庫(kù)

QPSQL PostgreSQL (7.3 或更新版本)

QSQLITE2 SQLite 2

QSQLITE SQLite 3

QSYMSQL 針對(duì) Symbian 平臺(tái)的SQLite 3

QTDS Sybase Adaptive Server (自 Qt 4.7 起廢除)

不過,由于受到協(xié)議的限制,Qt 開源版本并沒有提供上面所有驅(qū)動(dòng)的二進(jìn)制版本,而僅僅以源代碼的形式提供。通常,Qt 只默認(rèn)搭載 QSqlite 驅(qū)動(dòng)(這個(gè)驅(qū)動(dòng)實(shí)際還包括 Sqlite 數(shù)據(jù)庫(kù),也就是說,如果需要使用 Sqlite 的話,只需要該驅(qū)動(dòng)即可)。我們可以選擇把這些驅(qū)動(dòng)作為 Qt 的一部分進(jìn)行編譯,也可以當(dāng)作插件編譯。

如果習(xí)慣于使用 SQL 語句,我們可以選擇QSqlQuery類;如果只需要使用高層次的數(shù)據(jù)庫(kù)接口(不關(guān)心 SQL 語法),我們可以選擇QSqlTableModel和QSqlRelationalTableModel。我們只介紹QSqlQuery類的使用。

在使用時(shí),我們可以通過

QSqlDatabase::drivers();

1

找到系統(tǒng)中所有可用的數(shù)據(jù)庫(kù)驅(qū)動(dòng)的名字列表。我們只能使用出現(xiàn)在列表中的驅(qū)動(dòng)。由于默認(rèn)情況下,QtSql 是作為 Qt 的一個(gè)模塊提供的。為了使用有關(guān)數(shù)據(jù)庫(kù)的類,我們必須早 .pro 文件中添加這么一句:

QT += sql

1

這表示,我們的程序需要使用 Qt 的 core、gui 以及 sql 三個(gè)模塊。注意,如果需要同時(shí)使用 Qt4 和 Qt5 編譯程序,通常我們的 .pro 文件是這樣的:

QT += core gui sql

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

1

2

這兩句也很明確:Qt 需要加載 core、gui 和 sql 三個(gè)模塊,如果主板本大于 4,則再添加 widgets 模塊。

下面來看一個(gè)簡(jiǎn)單的函數(shù):

bool connect(const QString dbName)

{

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");

// db.setHostName("host");

// db.setDatabaseName("dbname");

// db.setUserName("username");

// db.setPassword("password");

db.setDatabaseName(dbName);

if (!db.open()) {

QMessageBox::critical(0, QObject::tr("Database Error"),

db.lastError().text());

return false;

}

return true;

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

我們使用connect()函數(shù)創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)連接。我們使用QSqlDatabase::addDatabase()靜態(tài)函數(shù)完成這一請(qǐng)求,也就是創(chuàng)建了一個(gè)QSqlDatabase實(shí)例。注意,數(shù)據(jù)庫(kù)連接使用自己的名字進(jìn)行區(qū)分,而不是數(shù)據(jù)庫(kù)的名字。例如,我們可以使用下面的語句:

QSqlDatabase db=QSqlDatabase::addDatabase("QSQLITE", QString("con%1").arg(dbName));

1

此時(shí),我們是使用addDatabase()函數(shù)的第二個(gè)參數(shù)來給這個(gè)數(shù)據(jù)庫(kù)連接一個(gè)名字。在這個(gè)例子中,用于區(qū)分這個(gè)數(shù)據(jù)庫(kù)連接的名字是QString(“conn%1”).arg(dbName),而不是 “QSQLITE”。這個(gè)參數(shù)是可選的,如果不指定,系統(tǒng)會(huì)給出一個(gè)默認(rèn)的名字QSqlDatabase::defaultConnection,此時(shí),Qt 會(huì)創(chuàng)建一個(gè)默認(rèn)的連接。如果你給出的名字與已存在的名字相同,新的連接會(huì)替換掉已有的連接。通過這種設(shè)計(jì),我們可以為一個(gè)數(shù)據(jù)庫(kù)建立多個(gè)連接。

我們這里使用的是 sqlite 數(shù)據(jù)庫(kù),只需要指定數(shù)據(jù)庫(kù)名字即可。如果是數(shù)據(jù)庫(kù)服務(wù)器,比如 MySQL,我們還需要指定主機(jī)名、端口號(hào)、用戶名和密碼,這些語句使用注釋進(jìn)行了簡(jiǎn)單的說明。

接下來我們調(diào)用了QSqlDatabase::open()函數(shù),打開這個(gè)數(shù)據(jù)庫(kù)連接。通過檢查open()函數(shù)的返回值,我們可以判斷數(shù)據(jù)庫(kù)是不是正確打開。

QtSql 模塊中的類大多具有l(wèi)astError()函數(shù),用于檢查最新出現(xiàn)的錯(cuò)誤。如果你發(fā)現(xiàn)數(shù)據(jù)庫(kù)操作有任何問題,應(yīng)該使用這個(gè)函數(shù)進(jìn)行錯(cuò)誤的檢查。這一點(diǎn)我們也在上面的代碼中進(jìn)行了體現(xiàn)。當(dāng)然,這只是最簡(jiǎn)單的實(shí)現(xiàn),一般來說,更好的設(shè)計(jì)是,不要在數(shù)據(jù)庫(kù)操作中混雜界面代碼(并且將這個(gè)connect()函數(shù)放在一個(gè)專門的數(shù)據(jù)庫(kù)操作類中)。

接下來我們可以在main()函數(shù)中使用這個(gè)connect()函數(shù):

int main(int argc, char *argv[])

{

QApplication a(argc, argv);

if (connect("demo.db")) {

QSqlQuery query;

if (!query.exec("CREATE TABLE student ("

"id INTEGER PRIMARY KEY AUTOINCREMENT,"

"name VARCHAR,"

"age INT)")) {

QMessageBox::critical(0, QObject::tr("Database Error"),

query.lastError().text());

return 1;

}

} else {

return 1;

}

return a.exec();

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

main()函數(shù)中,我們調(diào)用這個(gè)connect()函數(shù)打開數(shù)據(jù)庫(kù)。如果打開成功,我們通過一個(gè)QSqlQuery實(shí)例執(zhí)行了 SQL 語句,就是query.exec();。同樣,我們使用其lastError()函數(shù)檢查了執(zhí)行結(jié)果是否正確。

注意這里的QSqlQuery實(shí)例的創(chuàng)建。我們并沒有指定是為哪一個(gè)數(shù)據(jù)庫(kù)連接創(chuàng)建查詢對(duì)象,此時(shí),系統(tǒng)會(huì)使用默認(rèn)的連接,也就是使用沒有第二個(gè)參數(shù)的addDatabase()函數(shù)創(chuàng)建的那個(gè)連接(其實(shí)就是名字為QSqlDatabase::defaultConnection的默認(rèn)連接)。如果沒有這么一個(gè)連接,系統(tǒng)就會(huì)報(bào)錯(cuò)。也就是說,如果沒有默認(rèn)連接,我們?cè)趧?chuàng)建QSqlQuery對(duì)象時(shí)必須指明是哪一個(gè)QSqlDatabase對(duì)象,也就是addDatabase()的返回值。

我們還可以通過使用QSqlQuery::isActive()函數(shù)檢查語句執(zhí)行正確與否。如果QSqlQuery對(duì)象是活動(dòng)的,該函數(shù)返回 true。所謂“活動(dòng)”,就是指該對(duì)象成功執(zhí)行了exec()函數(shù),但是還沒有完成。如果需要設(shè)置為不活動(dòng)的,可以使用finish()或者clear()函數(shù),或者直接釋放掉這個(gè)QSqlQuery對(duì)象。這里需要注意的是,如果存在一個(gè)活動(dòng)的 SELECT 語句,某些數(shù)據(jù)庫(kù)系統(tǒng)不能成功完成connect()或者rollback()函數(shù)的調(diào)用。此時(shí),我們必須首先將活動(dòng)的 SELECT 語句設(shè)置成不活動(dòng)的。

創(chuàng)建過數(shù)據(jù)庫(kù)表 student 之后,我們開始插入數(shù)據(jù),然后將其獨(dú)取出來:

if (connect("demo.db")) {

QSqlQuery query;

query.prepare("INSERT INTO student (name, age) VALUES (?, ?)");

QVariantList names;

names "Tom" "Jack" "Jane" "Jerry";

query.addBindValue(names);

QVariantList ages;

ages 20 23 22 25;

query.addBindValue(ages);

if (!query.execBatch()) {

QMessageBox::critical(0, QObject::tr("Database Error"),

query.lastError().text());

}

query.finish();

query.exec("SELECT name, age FROM student");

while (query.next()) {

QString name = query.value(0).toString();

int age = query.value(1).toInt();

qDebug() name ": " age;

}

} else {

return 1;

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

依舊連接到我們創(chuàng)建的 demo.db 數(shù)據(jù)庫(kù)。我們需要插入多條數(shù)據(jù),此時(shí)可以使用QSqlQuery::exec()函數(shù)一條一條插入數(shù)據(jù),但是這里我們選擇了另外一種方法:批量執(zhí)行。首先,我們使用QSqlQuery::prepare()函數(shù)對(duì)這條 SQL 語句進(jìn)行預(yù)處理,問號(hào) ? 相當(dāng)于占位符,預(yù)示著以后我們可以使用實(shí)際數(shù)據(jù)替換這些位置。簡(jiǎn)單說明一下,預(yù)處理是數(shù)據(jù)庫(kù)提供的一種特性,它會(huì)將 SQL 語句進(jìn)行編譯,性能和安全性都要優(yōu)于普通的 SQL 處理。在上面的代碼中,我們使用一個(gè)字符串列表 names 替換掉第一個(gè)問號(hào)的位置,一個(gè)整型列表 ages 替換掉第二個(gè)問號(hào)的位置,利用QSqlQuery::addBindValue()我們將實(shí)際數(shù)據(jù)綁定到這個(gè)預(yù)處理的 SQL 語句上。需要注意的是,names 和 ages 這兩個(gè)列表里面的數(shù)據(jù)需要一一對(duì)應(yīng)。然后我們調(diào)用QSqlQuery::execBatch()批量執(zhí)行 SQL,之后結(jié)束該對(duì)象。這樣,插入操作便完成了。

另外說明一點(diǎn),我們這里使用了 ODBC 風(fēng)格的 ? 占位符,同樣,我們也可以使用 Oracle 風(fēng)格的占位符:

query.prepare("INSERT INTO student (name, age) VALUES (:name, :age)");

1

此時(shí),我們就需要使用

query.bindValue(":name", names);

query.bindValue(":age", ages);

1

2

進(jìn)行綁定。Oracle 風(fēng)格的綁定最大的好處是,綁定的名字和值很清晰,與順序無關(guān)。但是這里需要注意,bindValue()函數(shù)只能綁定一個(gè)位置。比如

query.prepare("INSERT INTO test (name1, name2) VALUES (:name, :name)");

// ...

query.bindValue(":name", name);

1

2

3

只能綁定第一個(gè) :name 占位符,不能綁定到第二個(gè)。

接下來我們依舊使用同一個(gè)查詢對(duì)象執(zhí)行一個(gè) SELECT 語句。如果存在查詢結(jié)果,QSqlQuery::next()會(huì)返回 true,直到到達(dá)結(jié)果最末,返回 false,說明遍歷結(jié)束。我們利用這一點(diǎn),使用 while 循環(huán)即可遍歷查詢結(jié)果。使用QSqlQuery::value()函數(shù)即可按照 SELECT 語句的字段順序獲取到對(duì)應(yīng)的數(shù)據(jù)庫(kù)存儲(chǔ)的數(shù)據(jù)。

對(duì)于數(shù)據(jù)庫(kù)事務(wù)的操作,我們可以使用 QSqlDatabase::transaction() 開啟事務(wù),QSqlDatabase::commit() 或者QSqlDatabase::rollback() 結(jié)束事務(wù)。使用QSqlDatabase::database()函數(shù)則可以根據(jù)名字獲取所需要的數(shù)據(jù)庫(kù)連接。

linux qt4怎么打開qt5

Qt5推出一段時(shí)間了,經(jīng)過了試用,雖然還存在一些問題,比如Designer 缺少 WebView 和 ActiveQt 的UI工具,此外 WebKit 的 Release 版本似乎和Visual-Studio 2012 Express 編譯器不太吃勁,老是報(bào)運(yùn)行時(shí)錯(cuò)誤——好在目前用到的模塊都測(cè)試過了。

1,修改路徑系統(tǒng)。Qt4 的 QtGUI下很多類被獨(dú)立到widgets模塊里了,為了提高兼容性,把這些include 的抬頭全去了,直接是 #includeqapplication ,這樣,通過 Qt += 模塊名,即可彌合4,5之間的差異。

2,添加一個(gè)宏替換,Qt ::WFlag變成 Qt5 的 WindowFlags, 小問題。

3,插件系統(tǒng)的修改。 新的 Q_PLUGIN_METADATA 在插件實(shí)現(xiàn)類的首部,代替了以往在 CPP里Export 的模式,對(duì)遷移沒有影響。加入編譯預(yù)處理宏,判斷一下標(biāo)志,決定采用哪一種方法。

4,字符串處理方式問題。目前,由于項(xiàng)目對(duì)中文、英文和國(guó)際化的使用較為規(guī)范,沒有遇到亂碼的問題,可以認(rèn)為兼容性較好。

5,第三方依賴性

如果引用了 PostgreSQL 或 MySQL的Sql 連接插件,注意把 libpq 和 libmysql相關(guān)的庫(kù)文件拷貝到可執(zhí)行文件所在文件夾下,而不是 plugins 所在的文件夾,否則盡管可以枚舉到驅(qū)動(dòng),但連接可能失敗。如果引用了OCI的插件,注意不要拷貝oci.dll 到發(fā)布文件夾,在某些情形下,會(huì)導(dǎo)致連接失敗。而是利用發(fā)布目的機(jī)器路徑系統(tǒng)上的Oracle 連接實(shí)例來獲取依賴。

6、發(fā)布程序

Qt5的plugins 文件夾中的內(nèi)容,不要忘記一起發(fā)布。

總結(jié): 經(jīng)過測(cè)試, Qt4 到 5 的轉(zhuǎn)換比 Qt3-4 要平滑很多,一般的項(xiàng)目均可以快速遷移。


網(wǎng)頁(yè)標(biāo)題:包含qt4如何讀oracle的詞條
本文來源:http://www.dlmjj.cn/article/hohccp.html