top
Loading...
實例解析SQLServer2000和JDBC的融合

SQL Server 2000 是當今網絡編程中使用的比較多的一個數據庫系統,而Java則是流行的網絡編程語言,在網絡編程中涉及的比較多也比較重要的就是數據庫問題,Java自身提供了對各類主流數據庫系統的支持,通過提供Java.SQL 庫,提供了一個統一的接口,使得可以在Java環境下不必對程序作大規模的修改,只要更改相應的驅動程序,即可實現對各類數據庫的操作,從而提高軟件的生存周期和降低軟件的開發成本和維護費用,在這種情況下SQL Server 2000 和Java 的融合問題就顯得比較重要了,本文簡要地闡述一下SQL Server 2000 和jdk的融合問題。

系統需求:

數據庫:SQL Server 2000 sp3

驅動程序:SQL Server driver for JDBC

Java版本:jdk1.2以上

1、我們首先使用JDBC-odbc橋來實現數據庫的連接,這個相對簡單,首先使用SQL Server企業管理其建立一個數據庫test,并建立一個簡單的表first_table建立odbc數據源,各步驟采用默認操作即可。

編寫一個簡單的測試程序,該程序主要實現數據庫的連接,以及一個簡單的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();  } }

運行結果如下:

driver is okconection is ok100110021003100410051006Press any key to continue...

順利通過測試

2、我們這次不通過odbc橋來操作數據庫,我們采用SQL Server driver 來實現對SQLServer數據庫的操作,這將是我們這篇文章的重點,因為JDBC-odbc橋是一種常見的操作windows系統數據庫的常用方法,但它存在的缺點很多,所以現在很多開發者都側重于使用SQLServer driver來操作,在這里我們通過一步步的調試,來加深讀者對這種連接的理解。

在通常的理解下,只要我們裝了SQLServer driver for JDBC我們便可進行數據庫編程,事實則不然,首先我們看下邊的代碼:

/*********************************************** /* /*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 = "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();  } }

這段代碼跟上變得代碼是一樣的,差別在于驅動,還有url,這是在使用SQLServer driver for JDBC 中遇到的困惑

按道理講,上邊這段代碼應該沒錯,可首先我們來看一下,如果SQLser服務器沒有升級到sp3(在使用JDBC時,如果系統是xp或者2003務必要把SQLServer 升級到sp3),我們看看運行結果:

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.(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.(DbTest.Java:25)        at DbTest.main(DbTest.Java:46)Press any key to continue...

出現上邊錯誤的主要原因是默認的數據庫服務器端口1433沒有打開,無法直接連接。如果升級到sp3則這個問題可以結決,我們再來看看升級之后,程序運行的結果:

driver is okconection is okJava.SQL.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]對象名 'room' 無效。        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(Unknown Source)        at com.microsoft.JDBC.SQLServer.tds.TDSRequest.processReplyToken(Unknown Source)        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(Unknown Source)        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.(DbTest.Java:25)        at DbTest.main(DbTest.Java:46)Press any key to continue...

在這兒,用戶已經登陸上去,但是卻不能訪問里邊的數據表,出現這個問題的原因在于sa用戶為系統用戶,它雖然能夠登陸數據庫,但是storeManager數據庫里邊卻沒有這個用戶的訪問權限,所以,我們現在為這個數據庫重新建立一個用戶

share ,建立過程如下:在storeManager數據庫中選重用戶 ---〉新建用戶 -- 〉名稱選擇(這一步中有兩個關鍵點 1、身份驗證選SQL身份驗證,默認數據庫選StoreManager)-〉建立新教色share ,此時更改程序,將用戶登陸名和密碼修改一下,重新運行程序:

driver is okconection is ok100110021003100410051006Press any key to continue...

這次順利通過測試

總結:SQL Serve 和JDBC 的融合問題,關鍵涉及到Sp3補丁(端口開放)還有用戶問題,解決這兩個問題之后,剩余的便是SQL Server操作問題了,還有一點在遠程操作的時候,要把SQL Server 組設置一下,在安全性里邊亦將身份驗證更改為SQL Serve 驗證即可。

(T117)

作者:http://www.zhujiangroad.com
來源:http://www.zhujiangroad.com
北斗有巢氏 有巢氏北斗