com.microsoft.sqlserver.jdbc.SQLServerException: 該連接已關(guān)閉。出現(xiàn)這種錯(cuò)誤一般是connection的唯一性問題。因?yàn)槲ㄒ唬阅闵米躁P(guān)閉了connection對(duì)象,后面的就沒法用了,因此在連接類里面,不要將connection對(duì)象設(shè)置為static類型,將其設(shè)置為private一般類型即可。

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對(duì)這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡(jiǎn)單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名申請(qǐng)、虛擬主機(jī)、營(yíng)銷軟件、網(wǎng)站建設(shè)、青河網(wǎng)站維護(hù)、網(wǎng)站推廣。
945是由于數(shù)據(jù)庫丟失文件或其他資源(不足的日志空間或不足的數(shù)據(jù)空間,不足的內(nèi)存等)并且難以糾正時(shí)報(bào)的錯(cuò).
第一你的數(shù)據(jù)庫是不是空間不夠;第二你曾是不是非法關(guān)機(jī),導(dǎo)致文件丟失!
其語法如下:
RAISERROR ( { msg_id | msg_str | @local_variable }
{ ,severity ,state }
[ ,argument [ ,...n ] ]
)
[ WITH option [ ,...n ] ]
簡(jiǎn)要說明一下:
第一個(gè)參數(shù):{ msg_id | msg_str | @local_variable }
msg_id:表示可以是一個(gè)sys.messages表中定義的消息代號(hào);
使用 sp_addmessage 存儲(chǔ)在 sys.messages 目錄視圖中的用戶定義錯(cuò)誤消息號(hào)。
用戶定義錯(cuò)誤消息的錯(cuò)誤號(hào)應(yīng)當(dāng)大于 50000。
msg_str:表示也可以是一個(gè)用戶定義消息,該錯(cuò)誤消息最長(zhǎng)可以有 2047 個(gè)字符;
(如果是常量,請(qǐng)使用N'xxxx',因?yàn)槭莕varchar的)
當(dāng)指定 msg_str 時(shí),RAISERROR 將引發(fā)一個(gè)錯(cuò)誤號(hào)為 5000 的錯(cuò)誤消息。
@local_variable:表示也可以是按照 msg_str 方式的格式化字符串變量。
第二個(gè)參數(shù):severity
用戶定義的與該消息關(guān)聯(lián)的嚴(yán)重級(jí)別。(這個(gè)很重要)
任何用戶都可以指定 0 到 18 之間的嚴(yán)重級(jí)別。
[0,10]的閉區(qū)間內(nèi),不會(huì)跳到catch;
如果是[11,19],則跳到catch;
如果[20,無窮),則直接終止數(shù)據(jù)庫連接;
第三個(gè)參數(shù):state
如果在多個(gè)位置引發(fā)相同的用戶定義錯(cuò)誤,
則針對(duì)每個(gè)位置使用唯一的狀態(tài)號(hào)有助于找到引發(fā)錯(cuò)誤的代碼段。
介于 1 至 127 之間的任意整數(shù)。(state 默認(rèn)值為1)
當(dāng)state 值為 0 或大于 127 時(shí)會(huì)生成錯(cuò)誤!
第四個(gè)參數(shù):argument
用于代替 msg_str 或?qū)?yīng)于 msg_id 的消息中的定義的變量的參數(shù)。
第五個(gè)參數(shù):option
錯(cuò)誤的自定義選項(xiàng),可以是下表中的任一值:
LOG :在錯(cuò)誤日志和應(yīng)用程序日志中記錄錯(cuò)誤;
NOWAIT:將消息立即發(fā)送給客戶端;
SETERROR:將 @@ERROR 值和 ERROR_NUMBER 值設(shè)置為 msg_id 或 50000;
[SQL]代碼示例
--示例1DECLARE @raiseErrorCode nvarchar(50)
SET @raiseErrorCode = CONVERT(nvarchar(50), YOUR UNIQUEIDENTIFIER KEY)
RAISERROR('%s INVALID ID. There is no record in table',16,1, @raiseErrorCode)
--示例2RAISERROR (
N'This is message %s %d.', -- Message text,
10, -- Severity,
1, -- State,
N'number', -- First argument.
5 -- Second argument.
);
-- The message text returned is: This is message number 5.
GO
--示例3RAISERROR (N'%*.*s', -- Message text.
10, -- Severity,
1, -- State,
7, -- First argument used for width.
3, -- Second argument used for precision.
N'abcde'); -- Third argument supplies the string.
-- The message text returned is: abc.
GO
--示例4RAISERROR (N'%7.3s', -- Message text.
10, -- Severity,
1, -- State,
N'abcde'); -- First argument supplies the string.
-- The message text returned is: abc.
GO
--示例5
--A. 從 CATCH 塊返回錯(cuò)誤消息
以下代碼示例顯示如何在 TRY 塊中使用 RAISERROR 使執(zhí)行跳至關(guān)聯(lián)的 CATCH 塊中。
它還顯示如何使用 RAISERROR 返回有關(guān)調(diào)用 CATCH 塊的錯(cuò)誤的信息。
BEGIN TRY
RAISERROR ('Error raised in TRY block.', -- Message text.
16, -- Severity.
1 -- State.
);
END TRY
BEGIN CATCH
DECLARE @ErrorMessage NVARCHAR(4000);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;
SELECT
@ErrorMessage = ERROR_MESSAGE(),
@ErrorSeverity = ERROR_SEVERITY(),
@ErrorState = ERROR_STATE();
RAISERROR (@ErrorMessage, -- Message text.
@ErrorSeverity, -- Severity.
@ErrorState -- State.
);
END CATCH;
--示例6
--B. 在 sys.messages 中創(chuàng)建即席消息
以下示例顯示如何引發(fā) sys.messages 目錄視圖中存儲(chǔ)的消息。
該消息通過 sp_addmessage 系統(tǒng)存儲(chǔ)過程,以消息號(hào)50005添加到 sys.messages 目錄視圖中。
sp_addmessage @msgnum = 50005,
@severity = 10,
@msgtext = N'%7.3s';
GO
RAISERROR (50005, -- Message id.
10, -- Severity,
1, -- State,
N'abcde'); -- First argument supplies the string.
-- The message text returned is: abc.
GO
sp_dropmessage @msgnum = 50005;
GO
--示例7
--C. 使用局部變量提供消息文本
以下代碼示例顯示如何使用局部變量為 RAISERROR 語句提供消息文本。sp_addmessage @msgnum = 50005,
@severity = 10,
@msgtext = N'%7.3s';
GO
RAISERROR (50005, -- Message id.
10, -- Severity,
1, -- State,
N'abcde'); -- First argument supplies the string.
-- The message text returned is: abc.
GO
sp_dropmessage @msgnum = 50005;
GO
轉(zhuǎn)自博客園:
begin
try---------------bengin
try
已成處理通常把容易出錯(cuò)的sql語句寫在和end
try的中間
select
5/0
end
try
begin
catch-------開始捕獲異常,顯示異常信息
select
error_number()
,
error_message(),
error_state(),
error_severity()
'測(cè)試成功'
end
catch
import java.sql.ResultSet; //都是導(dǎo)入一些下面需要用到的類
String ConnStr="jdbc:microsoft:sqlserver://WINJUE:1433;DatabaseName=library";//jdbc連接數(shù)據(jù)庫url
public sqlServer() {
try {
Class.forName(DBDriver).newInstance(); //加載SQLServer驅(qū)動(dòng)程序,DBDriver是你上面的代碼;
conn=DriverManager.getConnection(ConnStr,"sa","sa"); //和數(shù)據(jù)庫建立連接,ConnStr里面的://WINJUE:1433;DatabaseName=library 分別是主機(jī)地址:端口號(hào);你自己建的數(shù)據(jù)庫(database)
}
catch(SQLException e) { //捕獲SQL異常
System.out.println(e.getMessage()); //要是出現(xiàn)異常,捕獲到后,這句代碼會(huì)把異常的信息(出錯(cuò)的原因之類的)打印出來。
}
catch(Exception e) { //捕獲異常,這個(gè)是總的,所以不能和上面的順序顛倒,先小到大,我連ORACLE和MYSQL,這個(gè)我通常不要,只須捕獲SQL異常就OL
System.out.println(e.getMessage());
}
}
public Connection getConn(){ //獲取連接方法
return conn;
}
public void insert(String sql) {//增刪改
try {
Statement stm=conn.createStatement(); 調(diào)用conn下的方法,創(chuàng)建Statement對(duì)象
stm.executeUpdate(sql);//調(diào)用Statement下的方法執(zhí)行SQL語句
System.out.println("操作成功");
}
catch(Exception e){
System.out.println(e.getMessage()); //如上
}
}
public ResultSet query(String sql){ //查詢
try{
Statement stm=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
rs=stm.executeQuery(sql); //如上
}
catch(Exception e){
System.out.println(e.getMessage());
}
return rs;
}
public static void main(String args[]){
sqlServer conn=new sqlServer(); //創(chuàng)建sqlServer,就是你上面的類,以便調(diào)用里面的方法
ResultSet rs=conn.query("select * from Orders"); //調(diào)用query方法,執(zhí)行SQL語句后,把結(jié)果保存到結(jié)果集里
//conn.insert("delete from BookInfo where BookName =" +"\'悟空傳\'");
//conn.insert("insert into BookInfo (BookID,BookName,Author,KeyWord) values (14445678,'悟空傳','今何在','孫悟空')");
try{
while(rs.next()){ //循環(huán),判斷結(jié)果集里的記錄,一條條往下走,是否還有下一條記錄,若是返回真,繼續(xù)走
System.out.print(rs.getString("OrderID"));
//System.out.print(rs.getString("U_age"));
}
rs.close() ; //關(guān)閉結(jié)果集
}
catch (Exception e){
System.out.println(e.getMessage());
}
}
}
注:
TYPE_FORWARD_ONLY:缺省類型。只允許向前訪問一次,并且不會(huì)受到其他用戶對(duì)該數(shù)據(jù)庫所作更改的影響。
TYPE_SCROLL_INSENSITIVE:允許在列表中向前或向后移動(dòng),甚至能進(jìn)行特定定位,例如移至列表中的第四個(gè)記錄或從當(dāng)前位置向后移動(dòng)兩個(gè)記錄。不會(huì)受到其他用戶對(duì)該數(shù)據(jù)庫所作更改的影響。
TYPE_SCROLL_SENSITIVE:象 TYPE_SCROLL_INSENSITIVE 相同,允許在記錄中定位。這種類型受到其他用戶所作更改的影響。如果用戶在執(zhí)行完查詢之后刪除一個(gè)記錄,那個(gè)記錄將從 ResultSet 中消失。類似的,對(duì)數(shù)據(jù)值的更改也將反映在 ResultSet 中。
請(qǐng)參考
Result.next()只會(huì)在兩種情況發(fā)生異常:一是數(shù)據(jù)庫本身故障,二是已經(jīng)關(guān)閉。
而在你的程序中只是為了防止出現(xiàn)一個(gè)異常不影響其它的,那么可以假定了,前面的訪問是正確的。所以,第一個(gè)異常原因不可能出現(xiàn)的。而你不會(huì)自己主動(dòng)在另一個(gè)線程關(guān)閉數(shù)據(jù)庫吧?那么第二個(gè)異常原因也不可能出現(xiàn)。
所以,這個(gè)異常捕獲了,不必做任何處理,直接進(jìn)行下一個(gè)就行。
while(rs.next()){
try{
//..........
}
catch(SQLException ex){}
}
當(dāng)前名稱:sqlserver異常,sqlserver異常卡死
轉(zhuǎn)載注明:http://chinadenli.net/article39/dsgpcph.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站、ChatGPT、動(dòng)態(tài)網(wǎng)站、網(wǎng)站制作、網(wǎng)站改版、網(wǎng)站導(dǎo)航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)