監(jiān)理公司管理系統(tǒng) | 工程企業(yè)管理系統(tǒng) | OA系統(tǒng) | ERP系統(tǒng) | 造價(jià)咨詢管理系統(tǒng) | 工程設(shè)計(jì)管理系統(tǒng) | 簽約案例 | 購(gòu)買價(jià)格 | 在線試用 | 手機(jī)APP | 產(chǎn)品資料
X 關(guān)閉

熱門數(shù)據(jù)庫(kù)JDBC驅(qū)動(dòng)試用心得

申請(qǐng)免費(fèi)試用、咨詢電話:400-8352-114

文章來(lái)源:泛普軟件

一、引言

無(wú)論是初級(jí)還是中高級(jí)技術(shù)人員,面對(duì)著各式各樣的數(shù)據(jù)庫(kù)平臺(tái)層出不窮和眾多的操作系統(tǒng)功能不斷升級(jí),難免會(huì)眼花繚亂。特別是當(dāng)系統(tǒng)面臨升級(jí),無(wú)論操作平臺(tái)還是數(shù)據(jù)庫(kù)平臺(tái),甚至架構(gòu)都可能需要更替的時(shí)候,如何才能抵住眾說(shuō)紛紜,把握好你的選擇。幸運(yùn)的是,利用Java技術(shù)可以將這些不同種別的數(shù)據(jù)庫(kù)平臺(tái)和操作系統(tǒng)無(wú)縫地連接起來(lái),真正地做到“集百家之長(zhǎng)而為我所用”。

本文將通過(guò)一組真實(shí)的案例來(lái)向讀者介紹如何做到簡(jiǎn)單地使用JDBC驅(qū)動(dòng)來(lái)實(shí)現(xiàn)在不同的操作系統(tǒng)下存取幾款較為熱門的數(shù)據(jù)庫(kù)平臺(tái)。

特別是對(duì)JavaDB這款支持嵌入式模式的純Java數(shù)據(jù)庫(kù)的開(kāi)發(fā)過(guò)程進(jìn)行了詳細(xì)分析和展望。希望讀者能做到舉一反三,引入更多的數(shù)據(jù)庫(kù)平臺(tái)的應(yīng)用。

二、評(píng)測(cè)框架

1.操作系統(tǒng)平臺(tái)和數(shù)據(jù)庫(kù)平臺(tái)

實(shí)例涉及到的操作系統(tǒng)是MS Windows XP + SP2和SUN Solaris 8,數(shù)據(jù)庫(kù)平臺(tái)有:MS Access 2000(以下簡(jiǎn)稱Access),MS SQL Server 2000(以下簡(jiǎn)稱SQL Server),My SQL,Oracle和Java DB(J2SE 1.6.0中綁定)。

對(duì)于XP平臺(tái),可以安裝以上5種數(shù)據(jù)庫(kù)平臺(tái)。而對(duì)于Solaris,只可以安裝My SQL和Java DB兩種。

2.使用平臺(tái)搭建

(1)安裝支持對(duì)應(yīng)操作系統(tǒng)的JDK(http://java.sun.com/javase/downloads/index.jsp)。注意:如果是Solaris操作系統(tǒng)還必須選擇對(duì)應(yīng)的CPU類型,本案例中選用的是支持SPARC的JDK版本(jdk-6-solaris-sparc.sh)。在XP系統(tǒng)中安裝的JDK Update3版本的JDK(jdk-6u3-windows-i586-p.exe),保證該版本中已經(jīng)綁定Java DB。

(2)設(shè)置JAVA_HOME,PATH和CLASSPATH等環(huán)境變量。以便正常編譯和運(yùn)行Java代碼。

(3)下載My SQL Connector/J驅(qū)動(dòng),并將其中的mysql-connector-java-5.1.0-bin.jar文件(其中5.1.0為驅(qū)動(dòng)版本號(hào))添加到CLASSPATH變量中。需要說(shuō)明的是,該驅(qū)動(dòng)文件中包含兩種JDBC驅(qū)動(dòng),一種是mm.mysql,一種是mysql普通JDBC驅(qū)動(dòng)。兩者都可以使用。

(4)將包含Java DB和Oracle的驅(qū)動(dòng)文件加入到CLASSPATH中。分別為derby.jar和classes12.jar。都可以在相應(yīng)的產(chǎn)品安裝目錄中找到。

通過(guò)上述的配置之后,我們就可以開(kāi)始在XP系統(tǒng)和Solaris系統(tǒng)中對(duì)各類數(shù)據(jù)庫(kù)平臺(tái)進(jìn)行使用了。

三、試用準(zhǔn)備

1.簡(jiǎn)化JDBC函數(shù)

為了方便開(kāi)發(fā)人員的使用,作者提煉出以下簡(jiǎn)化后的常用JDBC函數(shù):

這些函數(shù)基本上已經(jīng)滿足大部分的使用,初級(jí)開(kāi)發(fā)人員按照函數(shù)的調(diào)用步驟就可以實(shí)現(xiàn)通過(guò)JDBC驅(qū)動(dòng)與各種數(shù)據(jù)庫(kù)平臺(tái)進(jìn)行交互了。

如果用戶對(duì)數(shù)據(jù)庫(kù)操作的效率比較關(guān)注,那么還有3組比較重要的,也是常用的JDBC函數(shù),分別是:

(1)事務(wù)處理函數(shù):setAutoCommit/commit/rollback

(2)批處理函數(shù):addBatch/execBatch

(3)語(yǔ)句預(yù)處理函數(shù):prepareStatement

對(duì)于大多數(shù)開(kāi)發(fā)人員,只需要知道其用法含義即可,深層次的探索和分析可能需要另外的篇幅來(lái)說(shuō)明,因此作者在此不再贅述。

實(shí)際上,上述基本函數(shù)的定義,大部分都是對(duì)JDK中JDBC函數(shù)的封裝,讀者也可以通過(guò)JDBC的文檔進(jìn)行相關(guān)的查閱。關(guān)鍵代碼參見(jiàn)全文末尾附錄部分。

2.?dāng)?shù)據(jù)庫(kù)表定義

作為試用,作者并沒(méi)有定義很復(fù)雜的數(shù)據(jù)庫(kù)表,以下是測(cè)試用數(shù)據(jù)表結(jié)構(gòu):

create table user_info(

ui_id varchar(64),

ui_passwd varchar(64),

ui_real_name varchar(64), primary key(ui_id));

3.試用思路

比較簡(jiǎn)單,就是通過(guò)上述不同類型的JDBC驅(qū)動(dòng)來(lái)連接各種數(shù)據(jù)庫(kù)平臺(tái),然后向已經(jīng)初始化的數(shù)據(jù)表插入10000條記錄,再逐條讀取,并記錄其各個(gè)步驟的執(zhí)行耗費(fèi)。

四、試用過(guò)程

1.平臺(tái)選擇

作者選擇了MS Windows XP和Solaris兩種平臺(tái)。其中只有MySQL,JavaDB和Oracle(連接遠(yuǎn)程服務(wù)器)既可在Windows平臺(tái)進(jìn)行了測(cè)試,也可在Solaris平臺(tái)下進(jìn)行了測(cè)試。兩個(gè)系統(tǒng)下的測(cè)試代碼和框架完全相同。

2.使用JDBC驅(qū)動(dòng)連接數(shù)據(jù)庫(kù)

(1)Access數(shù)據(jù)庫(kù)

通過(guò)JDBC驅(qū)動(dòng)連接Access數(shù)據(jù)庫(kù)最常用的是采用建立ODBC數(shù)據(jù)源(DSN)的方式進(jìn)行,但是本測(cè)試中采用的是通過(guò)數(shù)據(jù)庫(kù)連接字符串避開(kāi)了手工建立DSN的部分。以下是關(guān)鍵代碼:

final String connectStr =

“jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ=./TestDB.mdb”;

……

if( (conn = FoolDB.openDB(connectStr, null, null)) == null)

用過(guò)ADO的讀者可能一眼就看出來(lái)了,上述的連接字符串中的內(nèi)容和ADO很相似。事實(shí)上,作者就是為了避開(kāi)建立DNS而嘗試套用了ADO的連接字符串,結(jié)果嘗試通過(guò)了!

(2)SQL Server數(shù)據(jù)庫(kù)

需要說(shuō)明的,對(duì)于SQL Server的測(cè)試沒(méi)有采用Microsoft提供的SQL Server專用的JDBC驅(qū)動(dòng),還是通過(guò)借鑒ADO的連接字符串形式,沿用了JDK自帶的JdbcOdbc驅(qū)動(dòng)。

final String connectStr =

“jdbc:odbc:Driver={SQL Server};Server=.;Database=master;UID=sa;PWD=121fs”;

……

if( (conn = FoolDB.openDB(connectStr, null, null)) == null)

注意:用戶名和密碼已經(jīng)包含到連接字符串中。

SUN公司提供的SQL Server的JDBC驅(qū)動(dòng)的版本應(yīng)該比較陳舊,所以可能導(dǎo)致在操作數(shù)據(jù)庫(kù)功能支持和效率方面比當(dāng)前新的JDBC驅(qū)動(dòng)要差一些。Microsoft提供的SQL Server JDBC驅(qū)動(dòng)類名為:“com.microsoft.jdbc.sqlserver.SQLServerDriver”,連接字符串形如:“jdbc:microsoft:sqlserver://hostname:port;DataBaseName=dbname”。

(3)MySQL數(shù)據(jù)庫(kù)

眾所周知,MySQL數(shù)據(jù)庫(kù)既可以在Windows可以在Solaris平臺(tái)運(yùn)行,而且執(zhí)行效率也深得業(yè)界的好評(píng)。本試?yán)羞B接MySQL使用的是MySQL專用驅(qū)動(dòng)(在第一部分已經(jīng)詳述,在MySQL官方網(wǎng)頁(yè)有很多的支持文檔),以下是關(guān)鍵代碼:

final String connectStr = “jdbc:mysql://localhost/phome”; 

final String userName = “root”; //

final String passwd = ““;

……

if( (conn = FoolDB.openDB(connectStr, userName, passwd)) == null)

在本地連接時(shí),主機(jī)名可以使用“l(fā)ocalhost”,但如果連接遠(yuǎn)程主機(jī)時(shí),必須換成該遠(yuǎn)程主機(jī)的IP,而phome是MySQL數(shù)據(jù)庫(kù)名稱。

(4)Oracle數(shù)據(jù)庫(kù)

Oracle提供了thin和oci兩種類型的驅(qū)動(dòng),本測(cè)試中使用thin類型JDBC驅(qū)動(dòng)。

final String connectStr = “jdbc:oracle:thin:@WBS:1521/oracle088”;

final String userName = “test”;

final String passwd = “test”;

其中“WBS:1521/oracle088”為Oracle服務(wù)器的SID。

(5)Java DB

值得一提的,Java DB是由Apache Software Foundation主要參與開(kāi)發(fā)的一個(gè)數(shù)據(jù)庫(kù)(DB)項(xiàng)目,SUN在JDK1.6.0中將其進(jìn)行了綁定,它是一款名副其實(shí)的純Java代碼開(kāi)發(fā)的數(shù)據(jù)庫(kù)平臺(tái)??梢灾С諷erver/Client也可以支持嵌入式運(yùn)行模式,本實(shí)例中主要采用了嵌入式模式(Embedded)進(jìn)行操作:

final String connectStr = “jdbc:derby:FoolDB”;

……

if( (conn = FoolDB.openDB(connectStr, null, null)) == null)

其中FoolDB是在初始化過(guò)程中,使用連接字符串“jdbc:derby:FoolDB;create=true”進(jìn)行創(chuàng)建的。創(chuàng)建的結(jié)果是:在當(dāng)前目錄中創(chuàng)建一個(gè)名為FoolDB的目錄,該目錄又中包含log,seg0和tmp這3個(gè)文件夾,而數(shù)據(jù)庫(kù)內(nèi)容以多文件的方式存放于seg0目錄中。

注意:數(shù)據(jù)庫(kù)一旦創(chuàng)建之后,就無(wú)需再次創(chuàng)建了。

3.設(shè)置數(shù)據(jù)庫(kù)事務(wù)方式

當(dāng)數(shù)據(jù)庫(kù)連接成功之后,需要設(shè)定連接的事務(wù)方式(前提是該數(shù)據(jù)庫(kù)平臺(tái)支持事務(wù)處理)為非自動(dòng)提交,因?yàn)镴DBC函數(shù)默認(rèn)為自動(dòng)提交。

提交過(guò)于頻繁,就會(huì)使數(shù)據(jù)庫(kù)操作的效率較低。特別是對(duì)于Oracle這種絕對(duì)支持事務(wù)處理的數(shù)據(jù)平臺(tái)而言,設(shè)置是否自動(dòng)提交對(duì)系統(tǒng)的效率將有很大的影響。

4.采用批處理方式插入記錄

同樣一個(gè)考慮效率的操作,循環(huán)地執(zhí)行操作語(yǔ)句(Insert,Update)也會(huì)增加很多不必要地開(kāi)銷。試?yán)胁捎昧伺刻幚淼姆绞?,通過(guò)這種方式將要進(jìn)行的操作先進(jìn)行匯總,再批量提交執(zhí)行。這樣就可以獲得較高的執(zhí)行效率。

//Insert records 

for(int i = 0; i < RECORD_COUNT; ++i)

{

//Add each operation to batch

if(FoolDB.addBatch(execStat, “insert into user_info values('guest”

+ Integer.toString(i + 1)

+ “', '666666', '我是中國(guó)人')”) == false)

……

FoolDB.execBatch(execStat); //Execute batch operations

FoolDB.commit(conn);

FoolDB.setAutoCommit(conn, true);

這種批處理的方式,可以視同預(yù)處理,通過(guò)統(tǒng)合批量的操作來(lái)減少與數(shù)據(jù)庫(kù)的交互頻率,也減少數(shù)據(jù)庫(kù)訪問(wèn)IO設(shè)備的頻率,從而也可獲得較高的效率。

5.使用行游標(biāo)讀取記錄字段

記錄插入完畢之后,通過(guò)執(zhí)行查詢語(yǔ)句來(lái)獲取數(shù)據(jù)集。然后再通過(guò)簡(jiǎn)化函數(shù)moveNext來(lái)逐行讀取結(jié)果集的記錄行:

//Select from table 

String sql = "select * from user_info";

if( (queryRS = FoolDB.openQuery(queryStat, sql)) == null)

{

}

while(FoolDB.moveNext(queryRS) == true)

{

//Field ui_id, text(64) type

FoolDB.getFieldByName(queryRS, “ui_id”);

//Field ui_passwd, text(64) type

FoolDB.getFieldByName(queryRS, “ui_passwd”);

//Field ui_real_name, text(64) type

FoolDB.getFieldByName(queryRS, “ui_real_name”);

}

實(shí)際上,moveNext的函數(shù)名也來(lái)源于ADO(在作者看來(lái),JDBC和ADO的應(yīng)用方式是相同的)。

6.關(guān)閉數(shù)據(jù)庫(kù)

這里主要對(duì)以嵌入式模式運(yùn)行的JavaDB的關(guān)閉進(jìn)行說(shuō)明,其他數(shù)據(jù)庫(kù)的關(guān)閉,直接采用簡(jiǎn)化后的關(guān)閉函數(shù)(closeDB)即可。

在嵌入式模式,應(yīng)用程序退出時(shí)就必須關(guān)閉數(shù)據(jù)庫(kù)。但是如果應(yīng)用程序關(guān)閉數(shù)據(jù)庫(kù)失敗,當(dāng)JVM退出時(shí)不會(huì)對(duì)該未被關(guān)閉的連接進(jìn)行檢查,這樣就占用了數(shù)據(jù)庫(kù)的連接資源,就會(huì)影響后續(xù)的連接執(zhí)行效率。所以Apache Derby的建議是采用URL的方式顯示地關(guān)閉數(shù)據(jù)庫(kù)。以下是關(guān)鍵代碼:

FoolDB.closeDB(conn); //Close connection 

if(framework.equals("embedded") == true) //If in embedded mode

{

//Use URL to shutdown Derby

if(FoolDB.openDB("jdbc:derby:;shutdown=true", null, null) == null)

{

//If shutdown failure means that Derby already shutdown

isShutdownOk = true;

}

if (isShutdownOk == false) //Not shutdown normally

{

System.out.println("Derby shutdown NG.");

}

}

注意:關(guān)閉和判斷Derby數(shù)據(jù)庫(kù)是否正常關(guān)閉的連接字符串中是不包含數(shù)據(jù)庫(kù)名的。

 

7.記錄各步驟操作的時(shí)間戳

以上的操作中,在各個(gè)步驟之間添加了時(shí)間戳,以此來(lái)記錄各個(gè)數(shù)據(jù)庫(kù)平臺(tái)的執(zhí)行耗費(fèi)。

五、結(jié)果及分析

在對(duì)試用結(jié)果進(jìn)行評(píng)價(jià)之前,讀者需要考慮各款數(shù)據(jù)庫(kù)平臺(tái)的特點(diǎn),而不能簡(jiǎn)單地從執(zhí)行時(shí)間的長(zhǎng)短來(lái)進(jìn)行判斷,以下是筆者根據(jù)開(kāi)發(fā)經(jīng)驗(yàn)總結(jié)出的需要注意的地方:

(1)要保證JDBC驅(qū)動(dòng)和數(shù)據(jù)庫(kù)平臺(tái)的連接是無(wú)縫的。例如Oracle和JavaDB數(shù)據(jù)庫(kù)本身就是由Java開(kāi)發(fā),其JDBC驅(qū)動(dòng)和數(shù)據(jù)庫(kù)平臺(tái)的連接可以做到完全無(wú)縫,這樣可以充分體現(xiàn)出該款數(shù)據(jù)庫(kù)平臺(tái)的特性。反之,Access和SQL Server與對(duì)應(yīng)的JdbcOdbc驅(qū)動(dòng)之間的耦合可能就不如與ADO驅(qū)動(dòng)那么吻合,那么這些數(shù)據(jù)平臺(tái)的很多特性就無(wú)法通過(guò)這些JDBC驅(qū)動(dòng)得以體現(xiàn)。之前我們也提到,Microsoft專門有提供MS SQL Server的JDBC驅(qū)動(dòng),數(shù)據(jù)庫(kù)與這種“對(duì)口”的JDBC驅(qū)動(dòng)的耦合肯定要超過(guò)JdbcOdbc這種通用型的驅(qū)動(dòng)。

(2)數(shù)據(jù)庫(kù)平臺(tái)要有良好的可移植性。換句話說(shuō)就是數(shù)據(jù)庫(kù)跨操作系統(tǒng)的性能。在這些方面Oracle,MySQL和JavaDB就要比Access和SQL Server有明顯優(yōu)勢(shì),它們不僅可以支持Windows平臺(tái)而且也支持Solaris和Linux平臺(tái)。而且數(shù)據(jù)庫(kù)平臺(tái)的可移植很大程度也決定了應(yīng)用系統(tǒng)的可移植性。

(3)數(shù)據(jù)庫(kù)平臺(tái)要支持應(yīng)用的多樣化(需求彈性)。數(shù)據(jù)庫(kù)平臺(tái)應(yīng)該不僅可以對(duì)應(yīng)傳統(tǒng)的C/S,B/S模式,而且還可以擴(kuò)展為三層的,甚至是多層的模式,或者支持嵌入式系統(tǒng)的應(yīng)用。顯而易見(jiàn),本身使用Java開(kāi)發(fā)的Oracle和JavaDB在這些方面就具有得天獨(dú)厚的優(yōu)勢(shì)。而且JavaDB還支持嵌入式應(yīng)用,這樣以來(lái)數(shù)據(jù)庫(kù)的應(yīng)用空間就更為廣闊了。

所以基于以上幾點(diǎn)的考慮,我們就可以得出初步的意向:

(1)對(duì)于一般的中小型的C/S和B/S架構(gòu),MySQL可以說(shuō)是我們當(dāng)前首選。它在跨平臺(tái)和執(zhí)行效率方面表現(xiàn)得相當(dāng)?shù)某錾?/p>

(2)對(duì)于那些對(duì)系統(tǒng)構(gòu)架彈性要求比較高的系統(tǒng),可以選擇Oracle平臺(tái),并結(jié)合EJB規(guī)范進(jìn)行搭建系統(tǒng)構(gòu)架無(wú)疑將是很好的選擇。

(3)選用JavaDB進(jìn)行嵌入式平臺(tái)開(kāi)發(fā)似乎是不錯(cuò)的主意。由于現(xiàn)在很多嵌入式設(shè)備中都嵌入了Java內(nèi)核,JavaDB也就可以得以應(yīng)用了,嵌入式設(shè)備與其他系統(tǒng)共享數(shù)據(jù)的接口就變得及其簡(jiǎn)單。

(4)如果只在Windows平臺(tái)進(jìn)行開(kāi)發(fā)的中小型系統(tǒng),用Access或者SQL Server平臺(tái)也不妨是一種簡(jiǎn)單快捷的途徑。

六、結(jié)束語(yǔ)

通過(guò)前兩部分的說(shuō)明,相信大家對(duì)JDBC的使用應(yīng)該有相當(dāng)部分的了解和收獲。即使作為初學(xué)者,通過(guò)簡(jiǎn)化后的JDBC函數(shù)和固定的試用方式,就可以實(shí)現(xiàn)通過(guò)JSP頁(yè)面,Java Applet或者是Java Application等程序來(lái)訪問(wèn)各種類型的數(shù)據(jù)庫(kù)平臺(tái)了。即使是在本文中沒(méi)有提到的其他數(shù)據(jù)庫(kù)平臺(tái),例如:IBM的DB2,Solaris 10中綁定的PostgreSQL數(shù)據(jù)庫(kù)。

尤其的,對(duì)于中高級(jí)技術(shù)人員而言,也可以通過(guò)這幾種熱門的數(shù)據(jù)庫(kù)平臺(tái)在不同操作系統(tǒng)下的使用案例得到一定的參考。

其中,特別是介紹了對(duì)嵌入式數(shù)據(jù)庫(kù)的使用,相信也一定開(kāi)闊了大家的視野和應(yīng)用范圍,畢竟嵌入式系統(tǒng)的應(yīng)用在目前也是如火如荼。在后續(xù)的實(shí)際開(kāi)發(fā)中筆者會(huì)將更多的心得體會(huì)和大家一起分享。

七、附錄:

1.主要FoolDB函數(shù)參考

 

//Get a conn to special database. 

public static Connection openDB(final String url, final String user, final String passwd)

{

try

{

return (DriverManager.getConnection(url, user, passwd) );

}

catch (SQLException CONNECT_FAILURE)

{

}

}

//Get a statement object that can be used for query (read only)

public static Statement getQueryStat(final Connection conn)

{

try

{

return (conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,

ResultSet.CONCUR_READ_ONLY) );

}

catch(SQLException CREATE_QUERY_STATEMENT)

{

}

}

//Get a statement object that can be used for update (can write)

public static Statement getExecStat(final Connection conn)

{

try

{

return (conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,

ResultSet.CONCUR_UPDATABLE) );

}

catch(SQLException CREATE_EXEC_STATEMENT)

{

}

}

//Execute SQL statement, and get the result set.

public static ResultSet openQuery(final Statement stat, final String sql)

{

try

{

return (stat.executeQuery(sql) );

}

catch(SQLException OPEN_QUERY)

{

}

}

//Get the rows cout of result set.

//The result set type should be ResultSet type is TYPE_SCROLL_SENSITIVE.

public static int getRowsCount(ResultSet rs)

{

try

{

int rowsCount = 0;

//Backup current row no.

int rowNo = rs.getRow();

//Locate last row

rs.last();

//Get the rows count

rowsCount = rs.getRow();

//Return back original row

if(rowNo < 1) //before first row

{

rs.beforeFirst();

}

else //

{

rs.absolute(rowNo);

}

return (rowsCount);

}

catch(SQLException GET_ROWS_COUNT_FAILURE)

{

}

}

//Get the columns count of resut set.

public static int getColsCount(final ResultSet rs)

{

try

{

ResultSetMetaData rsmd = rs.getMetaData();

return (rsmd.getColumnCount() );

}

catch(SQLException GET_COLS_COUNT_FAILURE)

{

}

}

//Get special column name.

//Note: The index of column base 1, but not 0.

public static String getColName(final ResultSet rs, final int colIndex)

{

try

{

ResultSetMetaData rsmd = rs.getMetaData();

return (rsmd.getColumnName(colIndex) );

}

catch(SQLException GET_COL_NAME_FAILURE)

{

}

}

//Move the cursor of result set to next row

public static boolean moveNext(ResultSet rs)

{

try

{

return (rs.next() );

}

catch(SQLException MOVE_NEXT_FAILURE)

{

}

}

//Get the retValue of cell by special row number and column number

//The result set type should be ResultSet type is TYPE_SCROLL_SENSITIVE.

//Note: The index of row and column all base 1, but no 0.

public static Object getValueAt(ResultSet rs, final int rowIndex, final int colIndex)

{

if( (rowIndex < 1) || (colIndex < 1) )

{

return (null);

}

try

{

//Backup current row no.

int rowNo = rs.getRow();

Object retValue = null;

//Locate to special row

rs.absolute(rowIndex);

//Get retValue

retValue = rs.getObject(colIndex);

//Return back origianl row

rs.absolute(rowNo);

return (retValue);

}

catch(SQLException GET_VALUE_FAILURE)

{

}

}

//Get the retValue of cell by special row number and field name

//The result set type should be ResultSet type is TYPE_SCROLL_SENSITIVE.

//Note: The index of row and column all base 1, but no 0.

public static Object getFieldByName(ResultSet rs, final int rowIndex, final String fieldName)

{

if( (rowIndex < 1) || (fieldName.equals("") == true) )

{

return (null);

}

try

{

//Backup current row no.

int rowNo = rs.getRow();

Object retValue = null;

//Locate to special row

rs.absolute(rowNo);

//Get retValue

retValue = rs.getObject(fieldName);

//Return back origianl row no.

rs.absolute(rowNo);

return (retValue);

}

catch(SQLException GET_FIELD_BY_NAME_FAILURE)

{

}

}

//Get the retValue of cell within current row by special field name

//The result set type should be ResultSet type is TYPE_SCROLL_SENSITIVE.

//Note: The index of row and column all base 1, but no 0.

public static Object getFieldByName(final ResultSet rs, final String fieldName)

{

if( (isBOF(rs) == true) || (isEOF(rs) == true) )

{

return (null);

}

try

{

return (rs.getObject(fieldName) );

}

catch(SQLException GET_FIELD_BY_NAME_FAILURE)

{

}

}

//Get the retValue of cell within current row by special column index

//The result set type should be ResultSet type is TYPE_SCROLL_SENSITIVE.

//Note: The index of row and column all base 1, but no 0.

public static Object getFieldByIndex(final ResultSet rs, final int columnIndex)

{

if( (columnIndex < 1) || (isBOF(rs) == true) || (isEOF(rs) == true) )

{

return (null);

}

try

{

return (rs.getObject(columnIndex) );

}

catch(SQLException GET_FIELD_BY_INDEX_FAILURE)

{

}

}

(it168)

發(fā)布:2007-04-22 09:24    編輯:泛普軟件 · xiaona    [打印此頁(yè)]    [關(guān)閉]
相關(guān)文章:
西安OA系統(tǒng)
聯(lián)系方式

成都公司:成都市成華區(qū)建設(shè)南路160號(hào)1層9號(hào)

重慶公司:重慶市江北區(qū)紅旗河溝華創(chuàng)商務(wù)大廈18樓

咨詢:400-8352-114

加微信,免費(fèi)獲取試用系統(tǒng)

QQ在線咨詢

泛普西安OA快博其他應(yīng)用

西安OA軟件 西安OA新聞動(dòng)態(tài) 西安OA信息化 西安OA快博 西安OA行業(yè)資訊 西安軟件開(kāi)發(fā)公司 西安門禁系統(tǒng) 西安物業(yè)管理軟件 西安倉(cāng)庫(kù)管理軟件 西安餐飲管理軟件 西安網(wǎng)站建設(shè)公司