sqlserver异常,sqlserver异常卡死

com.microsoft.sqlserver.jdbc.SQLServerException: 该连接已关闭. 这个异常要怎么解决??

com.microsoft.sqlserver.jdbc.SQLServerException: 该连接已关闭。出现这种错误一般是connection的唯一性问题。因为唯一,所以你擅自关闭了connection对象,后面的就没法用了,因此在连接类里面,不要将connection对象设置为static类型,将其设置为private一般类型即可。

让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:域名申请虚拟主机、营销软件、网站建设、青河网站维护、网站推广。

SQL Server 2005 异常

945是由于数据库丢失文件或其他资源(不足的日志空间或不足的数据空间,不足的内存等)并且难以纠正时报的错.

第一你的数据库是不是空间不够;第二你曾是不是非法关机,导致文件丢失!

如何在sqlserver 的函数或存储过程中抛出异常

其语法如下:

RAISERROR ( { msg_id | msg_str | @local_variable }

{ ,severity ,state }

[ ,argument [ ,...n ] ]

)

[ WITH option [ ,...n ] ]

简要说明一下:

第一个参数:{ msg_id | msg_str | @local_variable }

msg_id:表示可以是一个sys.messages表中定义的消息代号;

使用 sp_addmessage 存储在 sys.messages 目录视图中的用户定义错误消息号。

用户定义错误消息的错误号应当大于 50000。

msg_str:表示也可以是一个用户定义消息,该错误消息最长可以有 2047 个字符;

(如果是常量,请使用N'xxxx',因为是nvarchar的)

当指定 msg_str 时,RAISERROR 将引发一个错误号为 5000 的错误消息。

@local_variable:表示也可以是按照 msg_str 方式的格式化字符串变量。

第二个参数:severity

用户定义的与该消息关联的严重级别。(这个很重要)

任何用户都可以指定 0 到 18 之间的严重级别。

[0,10]的闭区间内,不会跳到catch;

如果是[11,19],则跳到catch;

如果[20,无穷),则直接终止数据库连接;

第三个参数:state

如果在多个位置引发相同的用户定义错误,

则针对每个位置使用唯一的状态号有助于找到引发错误的代码段。

介于 1 至 127 之间的任意整数。(state 默认值为1)

当state 值为 0 或大于 127 时会生成错误!

第四个参数:argument

用于代替 msg_str 或对应于 msg_id 的消息中的定义的变量的参数。

第五个参数:option

错误的自定义选项,可以是下表中的任一值:

LOG :在错误日志和应用程序日志中记录错误;

NOWAIT:将消息立即发送给客户端;

SETERROR:将 @@ERROR 值和 ERROR_NUMBER 值设置为 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 块返回错误消息

以下代码示例显示如何在 TRY 块中使用 RAISERROR 使执行跳至关联的 CATCH 块中。

它还显示如何使用 RAISERROR 返回有关调用 CATCH 块的错误的信息。

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 中创建即席消息

以下示例显示如何引发 sys.messages 目录视图中存储的消息。

该消息通过 sp_addmessage 系统存储过程,以消息号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

转自博客园:

sqlserver里面的异常处理?

begin

try---------------bengin

try

已成处理通常把容易出错的sql语句写在和end

try的中间

select

5/0

end

try

begin

catch-------开始捕获异常,显示异常信息

select

error_number()

,

error_message(),

error_state(),

error_severity()

--print

'测试成功'

end

catch

sqlserver 哪些异常不能捕获

import java.sql.ResultSet; //都是导入一些下面需要用到的类

String ConnStr="jdbc:microsoft:sqlserver://WINJUE:1433;DatabaseName=library";//jdbc连接数据库url

public sqlServer() {

try {

Class.forName(DBDriver).newInstance(); //加载SQLServer驱动程序,DBDriver是你上面的代码;

conn=DriverManager.getConnection(ConnStr,"sa","sa"); //和数据库建立连接,ConnStr里面的://WINJUE:1433;DatabaseName=library 分别是主机地址:端口号;你自己建的数据库(database)

}

catch(SQLException e) { //捕获SQL异常

System.out.println(e.getMessage()); //要是出现异常,捕获到后,这句代码会把异常的信息(出错的原因之类的)打印出来。

}

catch(Exception e) { //捕获异常,这个是总的,所以不能和上面的顺序颠倒,先小到大,我连ORACLE和MYSQL,这个我通常不要,只须捕获SQL异常就OL

System.out.println(e.getMessage());

}

}

public Connection getConn(){ //获取连接方法

return conn;

}

public void insert(String sql) {//增删改

try {

Statement stm=conn.createStatement(); 调用conn下的方法,创建Statement对象

stm.executeUpdate(sql);//调用Statement下的方法执行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(); //创建sqlServer,就是你上面的类,以便调用里面的方法

ResultSet rs=conn.query("select * from Orders"); //调用query方法,执行SQL语句后,把结果保存到结果集里

//conn.insert("delete from BookInfo where BookName =" +"\'悟空传\'");

//conn.insert("insert into BookInfo (BookID,BookName,Author,KeyWord) values (14445678,'悟空传','今何在','孙悟空')");

try{

while(rs.next()){ //循环,判断结果集里的记录,一条条往下走,是否还有下一条记录,若是返回真,继续走

System.out.print(rs.getString("OrderID"));

//System.out.print(rs.getString("U_age"));

}

rs.close() ; //关闭结果集

}

catch (Exception e){

System.out.println(e.getMessage());

}

}

}

注:

TYPE_FORWARD_ONLY:缺省类型。只允许向前访问一次,并且不会受到其他用户对该数据库所作更改的影响。

TYPE_SCROLL_INSENSITIVE:允许在列表中向前或向后移动,甚至能进行特定定位,例如移至列表中的第四个记录或从当前位置向后移动两个记录。不会受到其他用户对该数据库所作更改的影响。

TYPE_SCROLL_SENSITIVE:象 TYPE_SCROLL_INSENSITIVE 相同,允许在记录中定位。这种类型受到其他用户所作更改的影响。如果用户在执行完查询之后删除一个记录,那个记录将从 ResultSet 中消失。类似的,对数据值的更改也将反映在 ResultSet 中。

请参考

如何捕获sqlserver数据库的异常

Result.next()只会在两种情况发生异常:一是数据库本身故障,二是已经关闭。

而在你的程序中只是为了防止出现一个异常不影响其它的,那么可以假定了,前面的访问是正确的。所以,第一个异常原因不可能出现的。而你不会自己主动在另一个线程关闭数据库吧?那么第二个异常原因也不可能出现。

所以,这个异常捕获了,不必做任何处理,直接进行下一个就行。

while(rs.next()){

try{

//..........

}

catch(SQLException ex){}

}


网站栏目:sqlserver异常,sqlserver异常卡死
分享URL:http://scyanting.com/article/dsgpcph.html