當(dāng)前位置:工程項(xiàng)目OA系統(tǒng) > 泛普各地 > 陜西OA系統(tǒng) > 西安OA系統(tǒng) > 西安OA快博
熱門數(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 =注意:用戶名和密碼已經(jīng)包含到連接字符串中。“jdbc:odbc:Driver={SQL Server};Server=.;Database=master;UID=sa;PWD=121fs”;
……
if( (conn = FoolDB.openDB(connectStr, null, null)) == null)
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”;在本地連接時(shí),主機(jī)名可以使用“l(fā)ocalhost”,但如果連接遠(yuǎn)程主機(jī)時(shí),必須換成該遠(yuǎn)程主機(jī)的IP,而phome是MySQL數(shù)據(jù)庫(kù)名稱。final String userName = “root”; //
final String passwd = ““;
……
if( (conn = FoolDB.openDB(connectStr, userName, passwd)) == null)
(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”;其中“WBS:1521/oracle088”為Oracle服務(wù)器的SID。final String userName = “test”;
final String passwd = “test”;
(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”;其中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目錄中。……
if( (conn = FoolDB.openDB(connectStr, null, null)) == null)
注意:數(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這種批處理的方式,可以視同預(yù)處理,通過(guò)統(tǒng)合批量的操作來(lái)減少與數(shù)據(jù)庫(kù)的交互頻率,也減少數(shù)據(jù)庫(kù)訪問(wèn)IO設(shè)備的頻率,從而也可獲得較高的效率。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);
5.使用行游標(biāo)讀取記錄字段
記錄插入完畢之后,通過(guò)執(zhí)行查詢語(yǔ)句來(lái)獲取數(shù)據(jù)集。然后再通過(guò)簡(jiǎn)化函數(shù)moveNext來(lái)逐行讀取結(jié)果集的記錄行:
//Select from table實(shí)際上,moveNext的函數(shù)名也來(lái)源于ADO(在作者看來(lái),JDBC和ADO的應(yīng)用方式是相同的)。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”);
}
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 connectionif(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)
- 1重慶OA快博
- 2貴陽(yáng)OA快博
- 3廣州OA快博
- 4深圳OA快博
- 5長(zhǎng)沙OA快博
- 6廈門OA快博
- 7濟(jì)南OA快博
- 8太原OA快博
- 9上海OA快博
- 10沈陽(yáng)OA快博
- 11長(zhǎng)春OA快博
- 12哈爾濱OA快博
- 1局域網(wǎng)加快網(wǎng)速妙招
- 2五大技術(shù)改變未來(lái)
- 3XML數(shù)據(jù)庫(kù)應(yīng)用現(xiàn)狀
- 4深圳大運(yùn)會(huì)投140億元收12億元 審計(jì)發(fā)現(xiàn)問(wèn)題
- 5讓路由器擺脫安全困擾的十個(gè)技巧
- 6云存儲(chǔ)后年將與電子商務(wù)比肩勢(shì)必流行
- 7記者臥底遭暴打 這是救助站還是黑心店
- 8郭德綱首次應(yīng)邀參加央視春晚 哈文秘密與其面談
- 9誰(shuí)是最大的信息安全漏洞?
- 10協(xié)同OA軟件成為公司真實(shí)存在的資產(chǎn)記錄
- 11網(wǎng)絡(luò)社區(qū)安全難題待解
- 12樓市現(xiàn)狀誰(shuí)都不敢動(dòng) 明年剛需濤聲依舊
- 13內(nèi)網(wǎng)安全市場(chǎng)的渠道利益模型探討
- 14九大技巧助力管理員設(shè)置高效UTM
- 15OA系統(tǒng)已經(jīng)默認(rèn)將雙休日不需要簽到
- 16知識(shí)管理六大失敗案例剖析
- 17京東惡意訂單解釋權(quán)遭質(zhì)疑 嚴(yán)重侵犯客戶權(quán)益
- 18如何保障虛擬服務(wù)器的安全
- 19網(wǎng)站如何防范“上傳漏洞”入侵
- 20日媒稱日本著手制定對(duì)付中國(guó)奪島戰(zhàn)略
- 212008年最熱7大軟件技能
- 22十大戰(zhàn)略性技術(shù)問(wèn)鼎2008
- 23Windows Vista服務(wù)安全強(qiáng)化的十大策略
- 24全球兩大陣營(yíng)ERP系統(tǒng)的技術(shù)分析
- 252013年南京家裝市場(chǎng)剛需裝修仍占主導(dǎo)地位
- 26XML數(shù)據(jù)庫(kù)在中國(guó)的應(yīng)用狀況
- 27數(shù)據(jù)災(zāi)難,就在我們身邊
- 28通向一流軟件設(shè)計(jì)的12級(jí)階梯
- 29OA辦公軟件可以直接點(diǎn)擊這個(gè)模板名稱鏈接即可
- 30西安本土OA協(xié)同管理軟件廠商都有哪些?
成都公司:成都市成華區(qū)建設(shè)南路160號(hào)1層9號(hào)
重慶公司:重慶市江北區(qū)紅旗河溝華創(chuàng)商務(wù)大廈18樓