SQL Server2000+JDBC常見(jiàn)問(wèn)題及解決
SQL Server 2000 是當(dāng)今網(wǎng)絡(luò)編程中使用的比較多的一個(gè)數(shù)據(jù)庫(kù)系統(tǒng),java是目前最流行的編程語(yǔ)言,在編程中涉及的比較多也比較重要的就是數(shù)據(jù)庫(kù)問(wèn)題,java自身提供了對(duì)各類(lèi)主流數(shù)據(jù)庫(kù)系統(tǒng)的支持,通過(guò)java.sql 庫(kù),提供了統(tǒng)一的接口,使得可以在java環(huán)境下不必對(duì)程序作大規(guī)模的修改,只要更改相應(yīng)的驅(qū)動(dòng)程序,即可實(shí)現(xiàn)對(duì)各類(lèi)數(shù)據(jù)庫(kù)的操作,從而提高軟件的生存周期和降低軟件的開(kāi)發(fā)成本和維護(hù)費(fèi)用,在這種情況下SQL Server 2000 和java 的融合問(wèn)題就顯得比較重要了,本文簡(jiǎn)要地闡述一下SQL Server 2000 和jdk的融合問(wèn)題。
系統(tǒng)需求:
數(shù)據(jù)庫(kù):SQL Server 2000 sp3 驅(qū)動(dòng)程序:SQL Server driver for jdbc java版本:jdk1.2以上
1:我們首先使用jdbc-odbc橋來(lái)實(shí)現(xiàn)數(shù)據(jù)庫(kù)的連接,這個(gè)相對(duì)簡(jiǎn)單。首先使用SQL Server 企業(yè)管理其建立一個(gè)數(shù)據(jù)庫(kù)test,并建立一個(gè)簡(jiǎn)單的表 first_table
建立odbc數(shù)據(jù)源 ,各步驟采用默認(rèn)操作即可
編寫(xiě)一個(gè)簡(jiǎn)單的測(cè)試程序,該程序主要實(shí)現(xiàn)數(shù)據(jù)庫(kù)的連接,以及一個(gè)簡(jiǎn)單的sql操作 ,代碼如下:
/***********************************************/*/*DbTest.java/*/******************************************* */
import java.sql.*;
public class DbTest {
Connection con; Statement sta; ResultSet rs;
String driver; String url; String user; String pwd; public DbTest() {driver = 'sun.jdbc.odbc.JdbcOdbcDriver';url = 'jdbc:odbc:store_manager';user = 'share';pwd = 'share';init(); } public void init() {try{ Class.forName(driver); System.out.println('driver is ok'); con = DriverManager.getConnection(url,user,pwd); System.out.println('conection is ok'); sta = con.createStatement(); rs = sta.executeQuery('select * from room'); while(rs.next())System.out.println(rs.getInt('roomNum')); }catch(Exception e){ e.printStackTrace();} }
public static void main(String args [])//自己替換[] {new DbTest(); }};
運(yùn)行結(jié)果如下:
driver is okconection is ok100110021003100410051006Press any key to continue...
順利通過(guò)測(cè)試
2、我們這次不通過(guò)odbc橋來(lái)操作數(shù)據(jù)庫(kù),我們采用SQL Server driver 來(lái)實(shí)現(xiàn)對(duì)SQL Server數(shù)據(jù)庫(kù)的操作, 這將是我們這篇文章的重點(diǎn),因?yàn)閖dbc-odbc橋是一種常見(jiàn)的操作windows系統(tǒng)數(shù)據(jù)庫(kù)的常用方法,但它存在的缺點(diǎn)很多,所以現(xiàn)在很多開(kāi)發(fā)者都側(cè)重于使用sqlserver driver來(lái)操作,在這里我們通過(guò)一步步的調(diào)試,來(lái)加深讀者對(duì)這種連接的理解
在通常的理解下,只要我們裝了sqlserver driver for jdbc 我們便可進(jìn)行數(shù)據(jù)庫(kù)編程,事實(shí)則不然,首先我們看下邊的代碼:
/***********************************************/*/*DbTest.java/*http://www.mypchelp.cn/******************************************* */
import java.sql.*;
public class DbTest {
Connection con; Statement sta; ResultSet rs;
String driver; String url; String user; String pwd; public DbTest() {driver = 'com.microsoft.jdbc.sqlserver.SQLServerDriver';;url = 'jdbc:microsoft:sqlserver://localhost:1433;DatabaseName =StoreManager';user = 'sa';pwd = 'potsmart10';init(); } public void init() {try{ Class.forName(driver); System.out.println('driver is ok'); con = DriverManager.getConnection(url,user,pwd); System.out.println('conection is ok'); sta = con.createStatement(); rs = sta.executeQuery('select * from room'); while(rs.next()) System.out.println(rs.getInt('roomNum')); }catch(Exception e){ e.printStackTrace();} }
public static void main(String args [])//自己替換[] {new DbTest(); }};
這段代碼跟上變得代碼是一樣的,差別在于驅(qū)動(dòng),還有url,這是在使用sqlserver driver for jdbc 中遇到的困惑。按道理講,上邊這段代碼應(yīng)該沒(méi)錯(cuò),可首先我們來(lái)看一下,如果SQL Server服務(wù)器沒(méi)有升級(jí)到sp3(在使用jdbc時(shí),如果系統(tǒng)是xp或者2003務(wù)必要把sqlserver 升級(jí)到sp3,往上到處都有下的),我們看看運(yùn)行結(jié)果
driver is okjava.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]Error establishing socket.at com.microsoft.jdbc.base.BaseExceptions.createException(Unknown Source)at com.microsoft.jdbc.base.BaseExceptions.getException(Unknown Source)at com.microsoft.jdbc.base.BaseExceptions.getException(Unknown Source)at com.microsoft.jdbc.sqlserver.tds.TDSConnection.<init>(Unknown Source)
at com.microsoft.jdbc.sqlserver.SQLServerImplConnection.open(Unknown Source)at com.microsoft.jdbc.base.BaseConnection.getNewImplConnection(Unknown Source)at com.microsoft.jdbc.base.BaseConnection.open(Unknown Source)at com.microsoft.jdbc.base.BaseDriver.connect(Unknown Source)at java.sql.DriverManager.getConnection(DriverManager.java:523)at java.sql.DriverManager.getConnection(DriverManager.java:171)at DbTest.init(DbTest.java:32)at DbTest.<init>(DbTest.java:25)at DbTest.main(DbTest.java:46)Press any key to continue...
出現(xiàn)上邊錯(cuò)誤的主要原因是默認(rèn)的數(shù)據(jù)庫(kù)服務(wù)器端口 1433沒(méi)有打開(kāi),無(wú)法直接連接 。
如果升級(jí)到sp3則這個(gè)問(wèn)題可以結(jié)決,我們?cè)賮?lái)看看升級(jí)之后,程序運(yùn)行的結(jié)果
driver is okconection is okjava.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]對(duì)象名 'room' 無(wú)效。at com.microsoft.jdbc.base.BaseExceptions.createException(Unknown Source)at com.microsoft.jdbc.base.BaseExceptions.getException(Unknown Source)at com.microsoft.jdbc.sqlserver.tds.TDSRequest.processErrorToken(UnknownSource)at com.microsoft.jdbc.sqlserver.tds.TDSRequest.processReplyToken(UnknownSource)at com.microsoft.jdbc.sqlserver.tds.TDSExecuteRequest.processReplyToken(Unknown Source)at com.microsoft.jdbc.sqlserver.tds.TDSRequest.processReply(Unknown Source)at com.microsoft.jdbc.sqlserver.SQLServerImplStatement.getNextResultType(Unknown Source)at com.microsoft.jdbc.base.BaseStatement.commonTransitionToState(UnknownSource)at com.microsoft.jdbc.base.BaseStatement.postImplExecute(Unknown Source)
at com.microsoft.jdbc.base.BaseStatement.commonExecute(Unknown Source)at com.microsoft.jdbc.base.BaseStatement.executeQueryInternal(Unknown Source)at com.microsoft.jdbc.base.BaseStatement.executeQuery(Unknown Source)at DbTest.init(DbTest.java:35)at DbTest.<init>(DbTest.java:25)at DbTest.main(DbTest.java:46)Press any key to continue...
在這兒,用戶(hù)已經(jīng)登陸上去,但是卻不能訪問(wèn)里邊的數(shù)據(jù)表,出現(xiàn)這個(gè)問(wèn)題的原因在于sa用戶(hù)為系統(tǒng)用戶(hù),它雖然能夠登陸數(shù)據(jù)庫(kù),但是storeManager數(shù)據(jù)庫(kù)里邊卻沒(méi)有這個(gè)用戶(hù)的訪問(wèn)權(quán)限,所以,我們現(xiàn)在為這個(gè)數(shù)據(jù)庫(kù)重新建立一個(gè)用戶(hù)share ,建立過(guò)程如下:在storeManager數(shù)據(jù)庫(kù)中選重用戶(hù) ---〉新建用戶(hù) -- 〉名稱(chēng)選擇(這一步中有兩個(gè)關(guān)鍵點(diǎn) 1:身份驗(yàn)證選sql身份驗(yàn)證,默認(rèn)數(shù)據(jù)庫(kù)選StoreManager)-〉建立新教色share ,此時(shí)更改程序,將用戶(hù)登陸名和密碼修改一下,重新運(yùn)行程序
driver is okconection is ok100110021003100410051006Press any key to continue...
這次順利通過(guò)測(cè)試
總結(jié):
SQL Server和jdbc 的融合問(wèn)題,關(guān)鍵涉及到sp3補(bǔ)丁(端口開(kāi)放)還有用戶(hù)問(wèn)題,解決這兩個(gè)問(wèn)題之后,剩余的便是sqlserver 操作問(wèn)題了,還有一點(diǎn)在遠(yuǎn)程操作的時(shí)候,要把sqlserver 組設(shè)置一下,在安全性里邊亦將身份驗(yàn)證更改為SQL Server 驗(yàn)證即可。
