程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> sqlserver 2000h 和 jdbc 的融合問題

sqlserver 2000h 和 jdbc 的融合問題

編輯:關於JAVA

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 ok

conection is ok

1001

1002

1003

1004

1005

1006

Press 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 ok

Java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]Error establis

hing 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 Sou

rce)

at com.microsoft.jdbc.base.BaseConnection.getNewImplConnection(Unknown S

ource)

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 ok

conection is ok

Java.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 Sour

ce)

at com.microsoft.jdbc.sqlserver.SQLServerImplStatement.getNextResultType

(Unknown Source)

at com.microsoft.jdbc.base.BaseStatement.commonTransitionToState(Unknown

Source)

at com.microsoft.jdbc.base.BaseStatement.postImplExecu

te(Unknown Source)

at com.microsoft.jdbc.base.BaseStatement.commonExecute(Unknown Source)

at com.microsoft.jdbc.base.BaseStatement.executeQueryInternal(Unknown So

urce)

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 ok

conection is ok

1001

1002

1003

1004

1005

1006

Press any k

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved