版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
3
JDBCJ2EE組件使用JDBC應(yīng)用程序編程接口(API)中包含的數(shù)據(jù)對象來提供數(shù)據(jù)庫訪問。JAVA數(shù)據(jù)對象中包含的方法能夠打開通向某一個DBMS的連接,然后發(fā)送消息(查詢)來插入、檢索、修改或刪除存儲在數(shù)據(jù)庫里的數(shù)據(jù)。DBMS使用同樣的連接把消息返回J2EE組件,這些消息包含J2EE組件請求的數(shù)據(jù)行或是
DBMS處理的狀態(tài)查詢信息。JAVA數(shù)據(jù)對象用來與DBMS返回給J2EE組件的數(shù)據(jù)進行交互。3.1
JDBC驅(qū)動程序JAVA程序員可以使用定義在JDBC
API里的高層JAVA數(shù)據(jù)對象來編寫與DBMS進行交互的程
序。JAVA數(shù)據(jù)對象把程序轉(zhuǎn)換成符合JDBC驅(qū)動程序規(guī)范的底層消息,并把消息發(fā)送到JDBC驅(qū)動程序,JDBC驅(qū)動程序再把程序翻譯成能被
DBMS理解和處理的底層消息。JDBC驅(qū)動程序使J2EE組件與數(shù)據(jù)庫無關(guān),這補充了JAVA的平臺無關(guān)性原則。功能:由DBMS制造商創(chuàng)建的JDBC驅(qū)動程序必須能夠:打開一個DBMS和J2EE組件之間的連接把J2EE組件發(fā)送的SQL語句的底層等價物翻譯為可以被DBMS處理的消息把符合JDBC規(guī)范的數(shù)據(jù)返回給JDBC驅(qū)動程序把符合JDBC規(guī)范的信息如錯誤消息返回給驅(qū)動程序提供符合JDBC規(guī)范的事務(wù)管理程序關(guān)閉DBMS和J2EE組件之間的連接類型:JDBC驅(qū)動程序規(guī)范把JDBC驅(qū)動程序分為4組:
(1)JDBC-to-ODBC驅(qū)動程序JDBC-to-ODBC驅(qū)動程序從符合JDBC規(guī)范的
J2EE組件接收消息,這些消息被JDBC-to-ODBC驅(qū)動程序轉(zhuǎn)換為ODBC消息格式,然后又被轉(zhuǎn)換為ODBC消息格式,然后再被轉(zhuǎn)換為
DBMS可以理解的消息格式。不要在關(guān)鍵任務(wù)應(yīng)用程序中使用該類型驅(qū)動程序,額外的轉(zhuǎn)換可能會給應(yīng)用程序的性能帶來負面影響。(2)JAVA/本地代碼驅(qū)動程序JAVA/本地代碼驅(qū)動程序使用JAVA類來產(chǎn)生平臺相關(guān)的代碼,也就是只能被一個特定的
DBMS所理解的代碼。DBMS制造商既提供
JAVA/本地代碼驅(qū)動程序也提供API類,這樣
J2EE組件可以產(chǎn)生特定平臺的代碼。使用JAVA/本地代碼驅(qū)動程序的明顯缺點就是代碼失去了一定的可移植性。(3)第三類JDBC驅(qū)動程序第三類JDBC驅(qū)動程序也稱做是JAVA協(xié)議,是最常用的JDBC驅(qū)動程序。第三類JDBC驅(qū)動程序把SQL查詢轉(zhuǎn)換為JDBC格式的語句,
JDBC格式的語句轉(zhuǎn)換為DBMS所需要的格式。(4)第四類JDBC驅(qū)動程序第四類JDBC驅(qū)動程序也稱做第四類數(shù)據(jù)庫協(xié)
議。這種驅(qū)動程序類似于第三類JDBC驅(qū)動程序,只不過在第四類驅(qū)動程序中,SQL查詢被轉(zhuǎn)換
為DBMS所需的格式而不必轉(zhuǎn)換為JDBC格式。這種方式是將SQL查詢傳遞給DBMS最快的方式。3.2
JDBC包JDBC括API包含在兩個包里:java.sql,包含JDBC
API的核心JAVA數(shù)據(jù)對象:為DBMS連接和存儲在DBMS里的數(shù)據(jù)進行
交互而提供的基本JAVA數(shù)據(jù)對象。java.sql是J2SE的一部分。javax.sql,擴展了java.sql,是J2EE的一部分,除其他高級JDBC特性外,java.sql還包含那些與JNDI進行交互的JAVA數(shù)據(jù)對象以及管理連接池的JAVA數(shù)據(jù)對象。3.3
JDBC處理過程各種J2EE組件與DBMS的交互過程是類似的,可以分為5個步驟:載入JDBC驅(qū)動程序連接到DBMS創(chuàng)建并執(zhí)行一個語句處理DBMS返回的數(shù)據(jù)終止與DBMS的連接(1)載入JDBC驅(qū)動程序在J2EE組件可以連接到DBMS之前必須先加載JDBC驅(qū)動程序。載入JDBC驅(qū)動程序的使用Class.forName()方法,該方法的參數(shù)為驅(qū)動程序的名稱,如:Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);(2)連接到DBMS載入驅(qū)動程序后,J2EE組件需要調(diào)用
DriverManager..getConnection()方法連接到
DBMS。該方法的參數(shù)是一個數(shù)據(jù)庫的URL,如果
DBMS需要的話,參數(shù)還要包括用戶ID與口令。該方法的返回結(jié)果是一個用于整個處理過程的
Connection接口,程序通過該接口引用數(shù)據(jù)庫。示例—連接到DBMSString
url=“jdbc:odbc:CustomerInformation”;String
userID
=
“l(fā)pf”;String
pwd
=
“whut”;private
Connection
Db;try{Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);Db
=DriverManager.getConnection(url,userID,pwd);}(3)創(chuàng)建并執(zhí)行SQL語句在載入驅(qū)動程序并成功與一個特定的DBMS管理的數(shù)據(jù)庫連接之后,下一步是要發(fā)送一個
SQL語句給DBMS處理。首先調(diào)用Connection.createStatement()方法創(chuàng)建一個Statement即語句對象,然后調(diào)用該對象的查詢方法從DBMS返回一個包含響應(yīng)結(jié)果的
ResultSet即結(jié)果集對象。示例—創(chuàng)建并執(zhí)行SQL語句
Statement
DataRequest;ResultSet
Results;try{String
query
=
“select
*
from
Customers”;DataRequest
=
Db.createStatement();Results
=
DataRequest.executeQuery(query);DataRequest.Close();}(4)處理從DBMS返回的數(shù)據(jù)從DBMS查詢處理的結(jié)果賦給java.sql.ResultSet對象。通過調(diào)用ResultSet的相關(guān)方法來操作數(shù)據(jù)。例:String
FisrtName;String
LastName;String
PrintStr;while(Results.next()){FirstName
=Results.getString(“FirstName”);LastName
=Results.getString(“LastName”);PrintStr
=
FirstName
+
“
“
+
LastName;System.out.println(PrintStr);}(5)終止與DBMS的連接J2EE組件完成對DBMS的訪問后,需要通過使用Connection的close()方法來終止與DBMS的連接。若在與DBMS結(jié)束連接時遇到問題,
close()方法會拋出一個異常。例:Db.close();3.4數(shù)據(jù)庫連接J2EE組件通過JDBC驅(qū)動程序連接DBMS,所以在連接DBMS數(shù)據(jù)庫之前需要加載JDBC驅(qū)動程序并在DriverManager中注冊。載入和注冊JDBC驅(qū)動程序的目的是把JDBC驅(qū)動程序加載到JVM中。JDBC驅(qū)動程序被載入的同時自動注冊DriverManager,所以可以被
JVM訪問并被J2EE組件使用。例:
try{Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);}catch(ClassNotFoundException
error){System.err.println(“Unable
to
load
theJDBC/ODBC
bridge.”
+
error.getMessage());System.exit(1);}(1)連接:在JDBC驅(qū)動程序成功加載和注冊后,J2EE組件需要連接數(shù)據(jù)庫。JDBC要連接的數(shù)據(jù)源使用URL格式來定義。
URL包括三個部分,即:jdbc指出JDC協(xié)議是用來讀取URL的<subprotocol>JDBC驅(qū)動程序的名字<subname>數(shù)據(jù)庫的名字與數(shù)據(jù)庫的連接通過使用DriverManager的getConnction()方法,該方法有3種形式(2次重載)。getConnection(String
url);getConnection(String
url,
String
user,
Stringpassword);getconnection(String
url,
Properties
props);例一:String
url
=
“jdbc:odbc:CustomerInformation”;Connection
Db;try{Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);Db
=
DriverManager.getConnection(url);}catch(ClassNotFoundException
error){System.err.println(“Unable
to
load
the
JDBC/ODBC
bridge.”
+error.getMessage());System.exit(1);}catch(SqlException
error){System.err.println(“Unable
to
connect
to
the
database.”
+error.getMessage());System.exit(2);}例二:String
url
=
“jdbc:odbc:CustomerInformation”;String
userID
=
“l(fā)pf”;String
password
=
“whut”;Connection
Db;try{Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);Db
=
DriverManager.getConnection(url,userID,password);}catch(ClassNotFoundException
error){System.err.println(“Unable
to
load
the
JDBC/ODBC
bridge.”
+error.getMessage());System.exit(1);}catch(SqlException
error){System.err.println(“Unable
to
connect
to
the
database.”
+error.getMessage());System.exit(2);}例三://用來訪問數(shù)據(jù)庫的屬性存儲在一個文本文件里String
url=“jdbc:odbc:CustomerInformation”;Connection
Db;Properties
props
=
new
Properties();try{FileInputStream
propFileStream
=
newfileInputStream(“DBProps.txt”);props.load(propFileStream);}catch(IOException
error){System.err.println(“Error
loading
propFile”
+error.getMessage());Sysyem.exit(1);}try{Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);Db
=
DriverManager.getConnection(url,props);}catch(ClassNotFoundException
error){System.err.println(“Unable
to
load
the
JDBC/ODBC
bridge.”
+error.getMessage());System.exit(2);}catch(SqlException
error){System.err.println(“Unable
to
connect
to
the
database.”
+error.getMessage());System.exit(3);}(2)超時:在實際網(wǎng)絡(luò)系統(tǒng)環(huán)境中,DBMS可能不會很快響應(yīng),數(shù)據(jù)庫連接可能不可用,為避免無限制或過長等待一個延遲的DBMS響應(yīng),J2EE組件
可以設(shè)置一個超時時間段,在這個時間段之后
DriverManager將終止連接數(shù)據(jù)庫的嘗試。方法:public
static
voidDriverManger.setLoginTimeout(int
seconds);(3)連接池:連接池是一個數(shù)據(jù)庫連接的集合,只打開一次并載入內(nèi)存,這些連接可以被重復(fù)使用而不必重新連接。從連接池訪問一個連接的方法:/*
InitialContext
is
a
class
of
starting
context
forperforming
naming
operations.*/Context
ctext
=
new
InitialContext();DataSource
pool
=(DataSource)ctext.lookup(“java:comp/env/jdbc/pool”);Conection
Db
=
pool.getConnection();Db.Close();//這里關(guān)閉的是邏輯連接而不是物理連接3.5
Statement對象一旦打開數(shù)據(jù)庫連接之后,J2EE組件創(chuàng)建并發(fā)送查詢來訪問包含在數(shù)據(jù)庫里的數(shù)據(jù)??梢允褂萌N類型的Statement對象中的一種來執(zhí)行查詢:Statement:用來立即執(zhí)行一個查詢。
PreparedStatement:用來執(zhí)行編譯過的查詢。
CallableStatement:用來執(zhí)行存儲過程。(1)Statement對象:Statement對象用于J2EE組件需要立即執(zhí)行一個查詢而不是首先編譯這個查詢。Statement對象包含executeQuery()方法,要執(zhí)行的SQL查詢作為一個參數(shù)傳遞給它,然后這個查詢傳送給DBMS處理。該方法返回
ResultSet對象。在可能存在多個返回結(jié)果時,使用Statemet對象的execute()方法。若要進行修改和刪除,使用Statement對象的
executeUpdate()方法。例一—executeQuery:try{String
query
=
“select
*
from
Customers”;Statement
DataRequest
=
Db.CreateStatement();ResultSet
Results
=DataRequest.executeQuery(query);DataRequest.close();}catch(SQLException
error){Sysyem.exit(1);}例二—executeUpdate:try{String
query
=
“update
Customers
set
paid
=
‘Y’”;Statement
DataRequest
=
Db.CreateStatement();ResultSet
Results
=DataRequest.executeUpdate(query);DataRequest.close();}catch(SQLException
error){Sysyem.exit(1);}(2)PreparedStatement對象:一個查詢必須在DBMS處理之前被編譯,編譯動作發(fā)生在Statement對象的執(zhí)行方法被調(diào)用之后。如果一個查詢被相同的J2EE組件實例在同一個會話中執(zhí)行多次的話,編譯處理可能會成為一個昂貴的系統(tǒng)開銷。使用PreparedStatement對象,可以預(yù)編譯一個SQL查詢并執(zhí)行它。在查詢被編譯后,一個問號會作為一個值的占位符插入到查詢中去。在執(zhí)行查詢前可以通過調(diào)用
PreparedStatement的Setxxx()方法設(shè)置這個值
(這里xxx代表數(shù)據(jù)類型,例如若為字符串則方法為SetString()),其參數(shù)有兩個,第一個參數(shù)是整數(shù),標(biāo)識問號占位符的位置,第二個參數(shù)是用來替換問號占位符的值。然后調(diào)用
PreparedStatement的executeQuery()方法。預(yù)編譯由DBMS執(zhí)行,稱為“晚期綁定”。當(dāng)
DBMS接收到這個請求時,DBMS試圖將該查詢
與編譯過后查詢相匹配。如果找到了匹配的查詢,那么用setxxx()方法傳遞給查詢的參數(shù)將被綁定并執(zhí)行查詢。如果沒有找到,那么查詢將被編譯,并由DBMS保留以備后用。例:
try{String
query
=
“select
*
from
Customers
whereCustNumber
=
?”;PreparedStatement
pstatement
=Db.preparedStatement(query);pstatement.setString(1,”123”);ResultSet
Results
=
pstatement.executeQuery();pstatement.close();}catch(SQLException
error){Sysyem.exit(1);}(3)CallableStatement對象:CallableStatement對象用來從J2EE對象中調(diào)用一個存儲過程。在調(diào)用一個存儲過程時,CallableStatement對象使用三種類型的參數(shù):IN、OUT和INOUT。IN參數(shù)包含傳遞給存儲過程的任何數(shù)據(jù),其值通過setxxx()方法來賦值。OUT參數(shù)包含由存儲過程返回的值。OUT參數(shù)必須使用registerOutParameter()方法注冊,然后J2EE組件使用getxxx()方法檢索它的值。INOUT參數(shù)是一個既可以用來傳遞信息給存儲過程,也可以用來從存儲過程中檢索信息的參數(shù)。例:
try{String
query
=
“{CALL
LastOrderNumber
(?)}”;CallableStatement
cstatement
=Db.prepareCall(query);cstatement.registerOutParameter(1,Types.Varchar);cstatement.execute();String
lastOrderNumber
=
cstatement.getString(1);cstatement.close();}catch(SQLException
error){Sysyem.exit(1);}說明:存儲過程有一個參數(shù),用一個問號占位代表。
Connection的prepareCall()方法返回一個CallableStatement對象。因為存儲過程使用一個OUT參數(shù),這個參數(shù)
必須使用CallableStatement對象的
registerOutParameter()方法進行注冊。該方法有兩個參數(shù),第一個是整數(shù),表示參數(shù)的編號,第二個表示存儲過程返回值的數(shù)據(jù)類型。調(diào)用CallableStatement對象的execute()方法執(zhí)行查詢。存儲過程執(zhí)行后,調(diào)用getString()方法返回存儲過程的指定參數(shù)值。3.6結(jié)果集Result對象包含一些方法來從結(jié)果集復(fù)制數(shù)據(jù)
到一個Java集合對象或變量中,以便進一步處理。
Result對象中的數(shù)據(jù)在邏輯上被組織成一個虛擬的包含行和列的表。Result對象還包含元數(shù)據(jù),如列名、列的大小以及列的數(shù)據(jù)類型。結(jié)果集使用一個游標(biāo)來指向虛擬表中的行。
J2EE組件必須移動游標(biāo)到各行,然后使用
ResultSet對象的其它方法來與存儲在那一行中的數(shù)據(jù)進行交互。當(dāng)executeQuery()方法返回一個結(jié)果集時,游標(biāo)指向結(jié)果集中的第一行之前。此時調(diào)用next()方法來使游標(biāo)指向結(jié)果集的第一行。如果行中包含數(shù)據(jù),next()方法返回true,否則返回false。一旦游標(biāo)指向一行數(shù)據(jù),可以使用getxxx()方法來從這一行復(fù)制數(shù)據(jù)到一個集合、對象或變
量中。該方法要求一個參數(shù),表示列號或列名。(1)讀取結(jié)果集:String
fName;String
lName;try{String
query
=
“select
FirstName,LastName
from
Customers”;Statement
da
=
Db.CreateStatement();ResultSet
rs
=
da.executeQuery(query);while(rs.next()){fName
=
rs.getString(1);lName
=
rs.getString(2);//put
other
code
here
to
handle
fName
and
lName}da.Close();}catch(SQLException
error){//put
exception
handling
code
here}(2)更新結(jié)果集:包含在結(jié)果集中的行可以被更新,就象表中的行可以被更新一樣。通過給Connection對象的createStatement()方法傳遞參數(shù)
CONCUR_UPDATABLE,更新就變?yōu)榭赡埽幌喾纯梢越ocreateStatement()方法傳遞參數(shù)CONCUR_READ_ONLY以阻止結(jié)果集被更新。默認(rèn)為CONCUR_READ_ONLY。(2)更新結(jié)果集—更新:首先調(diào)用updatexxx()方法來改變結(jié)果集當(dāng)前行中相關(guān)列的值。該方法要求兩個參數(shù),第一個是被更新結(jié)果集的列名或列號,第二個參數(shù)是用來替換的值。(updateNull將一個列的值用
NULL值來替換。updateNull方法要求一個參數(shù),即列號。注:該方法不接受列名作為參數(shù)。)然后調(diào)用updateRow()方法來使該行的改變生效。注:這個改變只出現(xiàn)在結(jié)果集中,表中相關(guān)行的值保持不變,直到運行一個更新查詢。例:將姓”Smity”修改為”Smith”String
lName;try{String
query
=
“select
FirstName,LastName
from
Customers”;Statement
da
=Db.CreateStatement(ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_UPDATABLE);ResultSet
rs
=
da.executeQuery(query);while(rs.next()){lName
=
rs.getString(“LastName”);if(lNpareTo(“Smity”)
==
0){rs.updateString(“LastName”,
“Smith”);rs.updateRow();}}da.Close();}catch(SQLException
error){//put
exception
handling
code
here}(2)更新結(jié)果集—刪除:調(diào)用deleteRow()方法來刪除結(jié)果集中的行。例:刪除所有姓為”Smith”的行String
lName;try{String
query
=
“select
FirstName,LastName
from
Customers”;Statement
da
=Db.CreateStatement(ResultSet.CONCUR_UPDATABLE);ResultSet
rs
=
da.executeQuery(query);while(rs.next()){lName
=
rs.getString(“LastName”);if(lNpareTo(“Smith”)
==
0){rs.deleteRow();}}da.Close();}catch(SQLException
error){//put
exception
handling
code
here}(2)更新結(jié)果集—插入:首先調(diào)用updatexxx()方法來指定放入結(jié)果集列里的列的值。然后調(diào)用insertRow(),使得插入到結(jié)果集中的一個新行擁有updatexxx()方法中參數(shù)所反映的值。注:這個操作也更新了后臺的數(shù)據(jù)庫。例:插入一行try{String
query
=
“select
FirstName,LastName
from
Customers”;Statement
da
=Db.CreateStatement(ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_UPDATABLE);ResultSet
rs
=
da.executeQuery(query);if(!rs.next()){//add
some
tip
message
hereSystem.Exit(4);}rs.updateString(1,“Tom”);rs.updateString(2,“Smith”);rs.insertRow();da.Close();}catch(SQLException
error){//put
exception
handling
code
here}(3)可滾動結(jié)果集:在JDBC2.1API以前,游標(biāo)只能在Result對象中向后移動,現(xiàn)在游標(biāo)可以支持向前移動,以及指向一個特定行。方法:next()向后移動一行first()移動到第一行l(wèi)ast()移動到最后一行previous()向前移動一行absolute()移動到指定行號的行relative()相對當(dāng)前位置向后(正數(shù))或向前移動(負數(shù))多少行g(shù)etRow()返回當(dāng)前行的行號通過給createStatement()方法傳遞下面三個常數(shù)之一來創(chuàng)建可滾動結(jié)果集:TYPE_FORWARD_ONLY游標(biāo)只能向后移動,默認(rèn)設(shè)置TYPE_SCROLL_INSENSITIVE結(jié)果集對另一J2EE組件對表中的數(shù)據(jù)修改不敏感。TYPE_SCROLL_SENSITIVE結(jié)果集對另一J2EE組件對表中的數(shù)據(jù)修改敏感。在創(chuàng)建滾動結(jié)果集之前最好判斷JDBC驅(qū)動程序是否支持其中的某些或全部特征。例:游標(biāo)的移動try{String
query
=
“select
FirstName,LastName
from
Customers”;Statement
da
=Db.CreateStatement(ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY);ResultSet
rs
=
da.executeQuery(query);if(!rs.next()){//add
some
tip
message
hereSystem.Exit(4);}rs.first();rs.last();rs.previous();rs.absolute(10);rs.relative(4);rs.relative(-4);da.Close();}catch(SQLException
error){//put
exception
handling
code
here}例:判斷JDBC驅(qū)動程序?qū)L動特性的支持DataBaseMetaData
meta
=
Db.getMetaData();boolean
forward
=meta.supportsResultsSetType(ResultSet.TYPE_FORWARD_ONLY);boolean
insensitive
=meta.supportsResultsSetType(ResultSet.TYPE_SCROLL_INSENSITIVE);boolean
sensitive
=meta.supportsResultsSetType(ResultSet.TYPE_SCROLL_SENSITIVE);3.7事務(wù)一個事務(wù)包括幾個任務(wù)即一系列的SQL語句的執(zhí)行,
每個語句必須成功完成事務(wù)才能完成;如果一個語句執(zhí)行失敗,事務(wù)中在此之前已成功執(zhí)行的語句必須被圓滾。事務(wù)的提交通過調(diào)用commit()方法,在調(diào)用該方法之前執(zhí)行的SQL語句都可以被回滾。一旦commit()方法被調(diào)用,該事務(wù)中執(zhí)行的SQL語句不能再圓滾。commit()方法必須被調(diào)用,不管SQL語句是否為事務(wù)的一部分,DBMS有一個AutoCommit屬性,其默認(rèn)值為true,每執(zhí)行一條語句commit()方法被自動調(diào)用。這意味著J2EE組件處理事務(wù)時需要將該屬性設(shè)為false,事務(wù)完成后,再將該屬性設(shè)置為true。例:執(zhí)行一個數(shù)據(jù)庫事務(wù)try{Db.SetAutoCommit(false);String
query1
=
“UPDATE
Customers
SET
Street=‘122
LuoshiRoad’
WHERE
FirstName
=
‘Bob’”;String
query2
=
“UPDATE
Customers
SET
Street=‘122
LuoshiRoad’
WHERE
FirstName
=
‘Tom’”;Statement
da
=
Db.CreateStatement();da.executeUpdate(query1);da.executeUpdate(query2);Db.Commit(); da.Close();
Db.Close();}catch(SQLException
error){
if(Db
!=
null)
Db.rollback();}例:保存點(用于指定事務(wù)內(nèi)回滾的停止點)SavePoint
sp1
=
null;try{Db.SetAutoCommit(false);String
query1=“…”;//偽代碼String
query2=“…”;//偽代碼Statement
da
=
Db.CreateStatement();da.executeUpdate(query1);sp1
=
Db.setSavePoint(“sp1”);da.executeUpdate(query2);Db.Commit();
da.Close();Db.releaseSavePoint(sp1);
Db.Close();}catch(SQLException
error){if(Db
!=
null)
Db.rollback(sp1);}例:批處理Statement
da
=
null;try{Db.SetAutoCom
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年陜西省榆林十中高考語文模擬試卷(一)
- 2025年《價值為綱》學(xué)習(xí)心得例文(6篇)
- 彩色噴墨打印材料項目融資計劃書
- 物流行業(yè)2025版租賃協(xié)議6篇
- 2025版宿舍樓宿管員職責(zé)聘用合同3篇
- 2025年度新型存款居間代理管理合同4篇
- 2025年度知識產(chǎn)權(quán)質(zhì)押貸款協(xié)議4篇
- 2025版托盤銷售與新能源車輛運輸服務(wù)合同范本3篇
- 2025年度個人與銀行個人貸款合作專項協(xié)議4篇
- 二零二五年度嬰幼兒奶粉品牌孵化與市場拓展合同
- 2024版塑料購銷合同范本買賣
- JJF 2184-2025電子計價秤型式評價大綱(試行)
- GB/T 44890-2024行政許可工作規(guī)范
- 2024年安徽省中考數(shù)學(xué)試卷含答案
- 2025屆山東省德州市物理高三第一學(xué)期期末調(diào)研模擬試題含解析
- 2024年滬教版一年級上學(xué)期語文期末復(fù)習(xí)習(xí)題
- 兩人退股協(xié)議書范文合伙人簽字
- 2024版【人教精通版】小學(xué)英語六年級下冊全冊教案
- 汽車噴漆勞務(wù)外包合同范本
- 2024年重慶南開(融僑)中學(xué)中考三模英語試題含答案
- 16J914-1 公用建筑衛(wèi)生間
評論
0/150
提交評論