求人指点下如何捕获SQL连接异常

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求人指点下如何捕获SQL连接异常相关的知识,希望对你有一定的参考价值。

求人指点下如何捕获SQL2005连接异常,我想做一个判断连接错误自动切换备用服务器的功能。

注:是SQL2005连接异常

我现在用try catch 捕捉SqlException异常,定义SqlException ce
里面有个属性ce。number 可以获取错误代码,但是连接错误代码是多少找了半天没找全,我自己试怕有丢掉的,感觉微软应该有批处理的方法。

个人觉得从两个大的方面去入手
首先,我觉得可能需要你去查询下SqlServer的帮组文档以便确定sqlexception中的哪些是跟连接相关的。原因很简单,如果不进行这样的区分的话普通的command对象抛出的异常也会被当成连接异常而处理,程序就乱套了。
第二,其实第二点我觉得更好使分成两个小点来讨论:
a。你打开一个connection,在打开的时候就发现数据库那边不正常了。这种情况应该是最简单最容易想到的
b。有可能会有“假连接”的情况出现。比如,本来连接是好的能够正常的打开,可是在你下一行代码想要执行的一个datareader.read()的时候,出错了。其实数据库那边可能在早些时候就被人shutdown掉了,而你非得要在执行read方法的时候才能发现这个问题,所以我自己称这种情况叫做“假连接”。
两种情况的处理应该有些不一样的。我自己想了下,可能代码写出来会类似下边这样子:
int count=0;//全局的一个计数器
int maxtry=5;//你自己可以指定一个对大的尝试次数
void fun()
try

....

catch(sqlconnectionexception e)//这个异常我随意写的,只是想说明你应该区分连接的异常和普通的数据库操作异常

conn.close();
if(count++<maxtry)

fun();

else
throw e;


大致上是这样子,这只是我的想法,可能还有很多方面没有考虑到,你自己要再多想想。
希望能帮上你的忙~
参考技术A 就是数据库异常嘛,这个异常不区分Sql2000还是2005
try
SqlConnection con = new SqlConnection("server=127.0.0.1;uid=sa;pwd=");
con.Open();

catch(SqlException)
// 连接出现异常


需要注意的是,如果sql执行出错,也是报SqlException异常
如果希望连接出异常,需要你在Connection.Open的时候去捕获
参考技术B 直接敲出错误的连接代码,如果你装的是vs2008 那么它会自动捕获的 参考技术C 这种方式很简单啊,你先用try catch捕捉SqlException异常,定义SqlException ce或者自定义一个异常码作为SQL异常的,只要你定义的这个SQL异常码有值,那么你就重新在catch块上获取一个新的数据库联接就OK了

ORA-00972: 标识符太长 - 如何在异常中捕获此错误

【中文标题】ORA-00972: 标识符太长 - 如何在异常中捕获此错误【英文标题】:ORA-00972: identifier is too long-how to catch this error in exception 【发布时间】:2015-06-15 16:47:05 【问题描述】:

如何捕获此错误

'ORA-00972: identifier is too long'在异常部分

在 oracle pl/sql 中,

你能给我举个例子吗

【问题讨论】:

除非您动态构建 SQL 语句,否则您不能。这是正常代码中的编译错误而不是运行时错误。您会在创建代码时注意到异常,而不是在执行代码时。 嗨贾斯汀,你能提供这个例子吗?这将非常有用 举个例子?通常,当您运行尝试使用无效标识符创建过程的CREATE OR REPLACE PROCEDURE 代码时,您会看到此类错误。当您尝试创建过程时会看到错误,并且您会像修复任何其他语法错误一样对其进行修复。您不会编写代码来捕获它。除非你在做动态构建 SQL 或 PL/SQL 之类的事情。 嗨贾斯汀,谢谢你的回答..我创建了一个带有 varchar2 参数的函数,所有异常都由它处理..我也想抓住这个,因为如果这个函数/过程被调用表单应用程序以及如果用户输入大字符串怎么办,它会给出“ORA-00972:标识符太长”错误..所以我想处理并写一个好的消息而不是错误......再次感谢您 前端是否将SQL语句作为输入参数传递给函数,然后该函数使用execute immediatedbms_sql动态执行?否则,我很难看到您将如何根据参数的值得到 ORA-00972 错误——当您尝试编译该过程时应该抛出该错误。 【参考方案1】:

捕获任何异常的方法是使用正确的异常号(在本例中为-972)初始化一个 EXCEPTION 变量,然后在 EXCEPTION 块中使用它:

DECLARE
  excpIdentifier_too_long  EXCEPTION;
  PRAGMA EXCEPTION_INIT(excpIdentifier_too_long, -972);
BEGIN
  NULL;  -- whatever
EXCEPTION
  WHEN excpIdentifier_too_long THEN
    DBMS_OUTPUT.PUT_LINE('Do something useful here');
END;

祝你好运。

【讨论】:

嗨,鲍勃,为什么这个错误不会出现在“当其他人”异常部分中 如果您愿意,我想您可以这样处理。在这种情况下,您应该执行类似 'WHEN OTHERS IF SQLCODE = -973 THEN NULL; /* 做任何需要处理的异常 */`.祝你好运。

以上是关于求人指点下如何捕获SQL连接异常的主要内容,如果未能解决你的问题,请参考以下文章

如何捕获sqlserver数据库的异常

如何使用 Amphp 捕获 php websocket 断开的 TCP 连接异常?

Oracle PL/SQL - 如何在异常子句的单独表中捕获坏数据?

如何使用 EF6 和 SQL Server 捕获 UniqueKey Violation 异常?

PL/SQL:捕获编号异常?

ORA-00972: 标识符太长 - 如何在异常中捕获此错误