


SQL Server2000+JDBC常見問題及解決
系統(tǒng)需求:
數(shù)據(jù)庫:SQL Server 2000 sp3
驅(qū)動(dòng)程序:SQL Server driver for jdbc
java版本:jdk1.2以上
1:我們首先使用jdbc-odbc橋來實(shí)現(xiàn)數(shù)據(jù)庫的連接,這個(gè)相對(duì)簡(jiǎn)單。
首先使用SQL Server 企業(yè)管理其建立一個(gè)數(shù)據(jù)庫test,并建立一個(gè)簡(jiǎn)單的表 first_table
建立odbc數(shù)據(jù)源 ,各步驟采用默認(rèn)操作即可
編寫一個(gè)簡(jiǎn)單的測(cè)試程序,該程序主要實(shí)現(xiàn)數(shù)據(jù)庫的連接,以及一個(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 ok
conection is ok
1001
1002
1003
1004
1005
1006
Press any key to continue...
順利通過測(cè)試
2、我們這次不通過odbc橋來操作數(shù)據(jù)庫,我們采用SQL Server driver 來實(shí)現(xiàn)對(duì)SQL Server數(shù)據(jù)庫的操作, 這將是我們這篇文章的重點(diǎn),因?yàn)閖dbc-odbc橋是一種常見的操作windows系統(tǒng)數(shù)據(jù)庫的常用方法,但它存在的缺點(diǎn)很多,所以現(xiàn)在很多開發(fā)者都側(cè)重于使用sqlserver driver來操作,在這里我們通過一步步的調(diào)試,來加深讀者對(duì)這種連接的理解
在通常的理解下,只要我們裝了sqlserver driver for jdbc 我們便可進(jìn)行數(shù)據(jù)庫編程,事實(shí)則不然,首先我們看下邊的代碼:
/***********************************************
/*
/*DbTest.java
/*http://www.knowsky.com
/******************************************* */
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)該沒錯(cuò),可首先我們來看一下,如果SQL Server服務(wù)器沒有升級(jí)到sp3(在使用jdbc時(shí),如果系統(tǒng)是xp或者2003務(wù)必要把sqlserver 升級(jí)到sp3,往上到處都有下的),我們看看運(yùn)行結(jié)果
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.<init>(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.<init>(DbTest.java:25)
at DbTest.main(DbTest.java:46)
Press any key to continue...
出現(xiàn)上邊錯(cuò)誤的主要原因是默認(rèn)的數(shù)據(jù)庫服務(wù)器端口 1433沒有打開,無法直接連接 。
如果升級(jí)到sp3則這個(gè)問題可以結(jié)決,我們?cè)賮砜纯瓷?jí)之后,程序運(yùn)行的結(jié)果
driver is ok
conection is ok
java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]對(duì)
象名 '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.<init>(DbTest.java:25)
at DbTest.main(DbTest.java:46)
Press any key to continue...
在這兒,用戶已經(jīng)登陸上去,但是卻不能訪問里邊的數(shù)據(jù)表,出現(xiàn)這個(gè)問題的原因在于sa用戶為系統(tǒng)用戶,它雖然能夠登陸數(shù)據(jù)庫,但是storeManager數(shù)據(jù)庫里邊卻沒有這個(gè)用戶的訪問權(quán)限,所以,我們現(xiàn)在為這個(gè)數(shù)據(jù)庫重新建立一個(gè)用戶share ,建立過程如下:在storeManager數(shù)據(jù)庫中選重用戶 ---〉新建用戶 -- 〉名稱選擇(這一步中有兩個(gè)關(guān)鍵點(diǎn) 1:身份驗(yàn)證選sql身份驗(yàn)證,默認(rèn)數(shù)據(jù)庫選StoreManager)-〉建立新教色share ,此時(shí)更改程序,將用戶登陸名和密碼修改一下,重新運(yùn)行程序
driver is ok
conection is ok
1001
1002
1003
1004
1005
1006
Press any key to continue...
這次順利通過測(cè)試
總結(jié):
SQL Server和jdbc 的融合問題,關(guān)鍵涉及到sp3補(bǔ)丁(端口開放)還有用戶問題,解決這兩個(gè)問題之后,剩余的便是sqlserver 操作問題了,還有一點(diǎn)在遠(yuǎn)程操作的時(shí)候,要把sqlserver 組設(shè)置一下,在安全性里邊亦將身份驗(yàn)證更改為SQL Server 驗(yàn)證即可。
關(guān)鍵字:SQL Server、jdbc 、端口
新文章:
- CentOS7下圖形配置網(wǎng)絡(luò)的方法
- CentOS 7如何添加刪除用戶
- 如何解決centos7雙系統(tǒng)后丟失windows啟動(dòng)項(xiàng)
- CentOS單網(wǎng)卡如何批量添加不同IP段
- CentOS下iconv命令的介紹
- Centos7 SSH密鑰登陸及密碼密鑰雙重驗(yàn)證詳解
- CentOS 7.1添加刪除用戶的方法
- CentOS查找/掃描局域網(wǎng)打印機(jī)IP講解
- CentOS7使用hostapd實(shí)現(xiàn)無AP模式的詳解
- su命令不能切換root的解決方法
- 解決VMware下CentOS7網(wǎng)絡(luò)重啟出錯(cuò)
- 解決Centos7雙系統(tǒng)后丟失windows啟動(dòng)項(xiàng)
- CentOS下如何避免文件覆蓋
- CentOS7和CentOS6系統(tǒng)有什么不同呢
- Centos 6.6默認(rèn)iptable規(guī)則詳解