批处理的错误处理
联机丛书中关于批处理的介绍已经很清晰了,摘录如下:
引用
批处理是包含一个或多个 Transact-SQL 语句的组,从应用程序一次性地发送到SQL Server执行。SQL Server 将批处理语句编译成一个可执行单元,此单元称为执行计划。执行计划中的语句每次执行一条。
编译错误(如语法错误)使执行计划无法编译,从而导致批处理中的任何语句均无法执行。
运行时错误(如算术溢出或违反约束)会产生以下两种影响之一:
大多数运行时错误将停止执行批处理中当前语句和它之后的语句。少数运行时错误(如违反约束)仅停止执行当前语句。而继续执行批处理中其它所有语句。
在生成错误的批处理、存储过程或触发器中,@@ERROR 是唯一可用部分。@@ERROR用来标记SQL语句的执行状况。@@ERROR=0,表示执行成功,否则,表示执行错误。由于 @@ERROR 在每一条语句执行后被清除并且重置,应在语句执行后立即检查它。
错误的所有其它部分,都只返回到那些能够用 API 错误处理机制进行错误处理的应用程序中。
关于上述说明的含义如下:
对于SQLServer服务器而言,虽然对于批处理执行过程中的语句错误情况,服务器已返回足够的错误信息。但SQLServer2000的T-SQL语言并没有提供类似Java的Try catch机制来捕获和处理这些错误。T-SQL需要用户在每一条语句执行后通过@@error来判断是否有语句执行错误。或者是在开启事务的情况下,打开XACT_ABORT开关,这样,当批处理中任意语句出现错误时,都将停止所有后续语句的执行并回滚事务。
对于JDBC程序而言,底层的数据库驱动在得到错误消息返回时,会产生并抛出SQLException异常。XACT_ABORT开关的状态不影响事务正确的被提交或者回滚。
联机丛书的说明如下(但还有些疑惑?):
引用
对于大多数 OLE DB 提供程序(包括 SQL Server),隐性或显式事务中的数据修改语句必须将 XACT_ABORT 设置为 ON。唯一不需要该选项的情况是提供程序支持嵌套事务时。
SET XACT_ABORT { ON | OFF }指定当 Transact-SQL 语句产生运行时错误时,SQL Server是否自动回滚当前事务。当 SET XACT_ABORT 为 ON 时,如果 Transact-SQL 语句产生运行时错误,整个事务将终止并回滚。为 OFF 时,只回滚产生错误的 Transact-SQL 语句,而事务将继续进行处理。
比如对于下面的SQL语句:
insert into cat values('11', 'aaa')
insert into cat values(null, 'bbb')//违反约束
insert into cat values('33', 'ccc')
GO
SQL查询分析器返回:
引用
(所影响的行数为 1 行)
服务器: 消息 515,级别 16,状态 2,行 1
无法将 NULL 值插入列 'id',表 'test.dbo.cat';该列不允许空值。INSERT 失败。
语句已终止。
(所影响的行数为 1 行)
而对于JDBC程序,第2条SQL语句将导致抛出异常:
public static void main(String[] args) throws Exception {
Properties info = new Properties();
info.put(Messages.get(Driver.BATCHSIZE), 30);
info.put("USER", "sa");
info.put("PASSWORD", "");
Connection conn = null;
Statement stmt = null;
try {
Class.forName("net.sourceforge.jtds.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:jtds:sqlserver://localhost:1433/test", info);
conn.setAutoCommit(false);
stmt = conn.createStatement();
stmt.addBatch("insert into cat values('11', 'aaa')");
stmt.addBatch("insert into cat values(null, 'bbb')");
stmt.addBatch("insert into cat values('33', 'ccc')");
stmt.executeBatch();
conn.commit();
} catch (Exception e) {
e.printStackTrace();
if (conn != null) conn.rollback();
} finally {
if (stmt != null) stmt.close();
if (conn != null) conn.close();
}
}
java.sql.Statement.executeBatch()的API说明如下:
引用
int[] executeBatch() throws SQLException将一批命令提交给数据库来执行,如果全部命令执行成功,则返回更新计数组成的数组。
如果批量更新中的命令之一无法正确执行,则此方法抛出 BatchUpdateException,并且 JDBC 驱动程序可能继续处理批处理中的剩余命令,也可能不执行。无论如何,驱动程序的行为必须与特定的 DBMS 一致,要么始终继续处理命令,要么永远不继续处理命令。
- 大小: 22.9 KB
分享到:
相关推荐
sqlserver数据库的学习笔记,里面有详细的知识模块,每一个模块都分得很清楚,有查修修改的sql语句,和语法,还有例子,让你一看就明白
对sqlserver的安装和在用户界面中对sqlserver数据库的一些详细的操作和例子
笔记是本人学习SQLServer一段时间后重新整理出来的,适合有一些入门基础的人学习。 ├─01 安装及使用 │ SQLServer2005安装及使用.txt │ ├─02 常用函数 │ function.sql ... Sqlserver数据库总结.sql
sql server数据库笔记.zip,真不错。。。总结的很到位!
Oracle SQLServer数据库 留在备用 培训资料
SQL Server 作为一个关系型数据库管理系统,涉及到一些专业术语。以下是几个常见的 SQL Server 专业术语的解释: 数据库(Database): 在 SQL Server 中,数据库是一个包含相关数据和对象的容器。它是数据的集合,...
数据库学习笔记。包括对系统数据库的介绍,自增字段和GUID的比较。
SQLserver 数据库学习笔记 欢迎大家下载学习,共同进步啊
本人自学数据库精华笔记,学习课程是任何一个知识点都不敢遗漏,方便软件开发过程中查阅和学习。主要内容是T-sql和sqlserver数据库知识。希望下载了的小童鞋能耐心学习。
SQLServer数据库基础知识笔记.docx
SQLServer数据库sql语句基本应用全解,是我学习过程中的笔记,我觉得很有用,所以分享给大家!!!
sql server 数据库学习笔记,希望对初学数据库的人能有所帮助
SQL Server 2000 笔记是我在上课的时候记的笔记,很实用的,无论是用sql还是Access数据库都可以供参考,里面有很多例子哦。
本视频强调实用性,讲解知识点时穿插了大量的典型示例,便于读者学习和理解。对于难度较高的知识点,使用精巧的示例化繁为简,便于读者掌握
MS SQL SERVER学习笔记,包括数据库技术简介,SQL server简介,完整性,数据库查询等。
数据库语法笔记 数据库笔记 语法大全 SQLServer语法 精心写的 -小鱼
重新复习了一下数据库,不知道还缺哪些
SQLServer 2012性能学习笔记
资源名称:SQL_Server2008数据库笔记资源截图: 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。
数据库学习笔记.sql