2011年第3期 SCIENCE&TECHNOLOGY INFORMATION O IT论坛0 科技信J_L 在SQL Server中一类错误的避免 周谊温且兵 (江西工业工程职业技术学院【摘江西萍乡 337055) 要】本文通过对SQL Server中常见出错原因的介绍,引入一类存储过程的错误实例,分析可能出现的问题,并由此探讨解决此类问 题的解决方案。 【关键词】Bug;SQL Server;错误;避免;事务 O引言 As set nocount on Bug这个词出现在电子管的计算机时代,一次偶然,技术人员在调 Declare@intErrorCode int 试一台计算机时出现了故障,研究人员费了半天时间,总算发现原因 Select@intE1TOrCode=@@Error 所在.当把一只小虫子从真空管中取出后,计算机又恢复正常。可能由 于计算机运行产生的光和热,引得一只小虫子(Bug)钻进了一支真空 管内.导致整个计算机无法工作。后来,Bug这个名词就沿用下来,表 示电脑系统或程序中隐藏的错误、缺陷或问题。 begin transaction Ⅱ@intEITOrCode=0 begin 1 了解SQL Sewer中的出错原因 对于SQL Server有很多原因会导致运行错误,我们在调试阶段到 实际运行后常见的出错原因有空值引起、大小或类型受限、各版本 SQL触发器回滚处理的不同、警告和低优先级错误等等。在SQL 插入进货记录 insert进货表(进货13期,货号,数量,进价,供货商ID,收货人) values(getdate0,@hh,@sl,@jj,@ghs,@shr) Select@intErrorCode=@@Error end If@intErrorCode=0 begin Server中警告不会终止存储过程的执行,甚至有的还在SQL环境中检 测不到警告的存在。低优先级错误可以使用@@error函数进行检测, 这类错误有一些会异常终止处理,但也有的不会异常终止执行过程, 如果有个错误在T—SQL中发生,但T—SQL系统没有认定为一个致命 更新库存量 update商品一览表set库存量=库存量+@sl where货号=@hh Select@intError(:Ode=@@Error 性错误,那么处理将继续,同时错误恰恰是致命性,那么所有的处理都 end 将停止.而该过程再也不会起作用。 If@intE11"OrCode=0 2 SQL Server中一类错误实例 Else C0MMIT TRANSACTION 我们以一个事例来分析这类错误,下面我们来看一个存储过程: ROLLBACK TRANSACTION return@intEITOrCode CREATE Procedure prlnsertjhDNXS G0 (@hh char(4),@sl int, j smallmoney,@ghs char(4),@shr varchar(8)) As 在嵌套调用存储过程中可能也有另外的一些错误,比如在调用存 set nocount on 储过程进行中出现另外的事务,为避免并发异常问题的出现我们可以 begin transaction 一将事务处理和上面这个解决方案完美地结合起来,在存储过程中加入 对事务的判断,于是我们可以再次优化上面这个存储过程如下: 插入进货记录 insert进货表(进货日期,货号,数量,进价,供货商ID,收货人) values(getdate0,@hh,@sl,@jj,@ghs,@shr) 更新库存量 update商品库存表set库存量=库存量+@s1 where货号:@hh 一CREATE Procedure prlnsertjhDNXS (@hh char(4),@sl int, j smallmoney,@ghs char(4),@shr varchar(8)) As set nocount on Select@intErrorCode=@@Error end C0MMIT TRANSACTION return Declare@intErrorCode int.@intTrCoOnEntry int Select@intErrorCode=@@Error Ⅱ@intError(:ode:0 Begin Select@intTrCoOnEntry @@TranCount BEGIN TRANSACTION 这个例子看起来好象没什么问题,但如果在Update语句中出现 了错误会怎么样呢,出现错误的原因可能是溢出、违背约束或权限问 题等等。那么错误发生时事务并不会自动回滚,而此时库存量的值就 已经出问题了。 End If@intErrorCode=0 begin 一3这类错误的避免处理 那么我们怎么解决这个问题呢,现在很多开发人员都会把错误处 理放到过程关键位置。例如在插入进货记录及更新库存量前加上对 @@error的判断。@@error<>O则回滚事务,如果企图返回或处理它那 插入进货记录 insefl进货表2006(进货日期,货号,数量,进价,供货商ID,收货人) values(getdate0,@hh,@sl,@ ,@ghs,@shr) Select@intErrorCode=@@Error 么最终该存储过程将会返回0,为什么不会返回错误号呢,原因是 end f@intErrorCode=0 @@error是个全局变量而返回的是最后~条语句的@@error值。我们 I可以定义一个用户变量来接受错误号,如果有错误发生时及时防止过 begin 程的进一步执行,并将控制权传递到该过程的结束位置所做更改将被 回滚。于是我们可以优化上面这个存储过程如下: CREATE Procedure prInse州hDNXS f@hh char(4),@sl int,@i smallmoney,@ghs char(4),@shr varchar(8)) 更新库存量 uDdate商品一览表set库存量=库存量+@s1 where货号=@}lh Select@intErrorCode=@@Error (下转第70页) 2011年第3期 SCIENCE&TECHNOLOGY INFORMATION OIY论坛。 科技信息 3.2.1需求分析 3.2_3概要设计阶段 需求阶段包含以下三个步骤。首先,定义系统的环境,产生系统环 根据需求分析模型定义系统的组织结构。组织结构描述了组织规 境成分列表。构成机器人哨兵系统环境的成分包括:营门管理者,巡逻 贝4、构成系统的基本成分以及它们之间的组织关系。在组织结构模型 者,报警者,求助者,值班员。其次,从环境成分的视点来描述系统的可 中,系统的基本成分被抽象为一个个的角色。系统成分之间的组织关 观察行为,识别出关于系统的一组组织场景。一般地,系统的组织场景 系主要包括以下集中类型:继承、管理、监督和对等合作等。 集合应是高层和完整的,尽可能覆盖系统的所有需求。第三,采用如表 3_3系统实现 ‘ 1所示的方式描述了值班员处理信息的组织场景。 在JADE平台中,建立一个完成特定任务的Agent需要使用jade. 表1 组织场景“处理信息”的描述 core包中两个重要的类,即Agent类和Behaviour类。Agent类定义了 场景名称 处理信息 JADE系统中Agent的公共基类,提供了收发消息,Agent的生存期状 参与角色 营门管理者、巡逻者、值班员 态管理等方法。开发Agent就是设计一个继承iade.Core.Agent的类。设 计Agent的行为实现特定的功能。实现系统的模拟,如图4所示。 前件 机器人感知到无法识别的人员类型 1、将感知情况信息发送至值班员。 事件流 2、值班员处理信息.将处理结果发送至营门管理者。 3、根据值班员发送的消息,打开营门或者发出警告。 后件 机器人继续执勤 3.2.2分析阶段 分析阶段以需求阶段所产生的模型为基础.包含以下三个软件开 发步骤。 第一,根据组织场景模型创建和分析系统的角色交互模型。角色 交互模型描述了组织场景是如何通过系统中的一组角色以及它们之 间的交互来完成的。 第二,根据组织场景模型和组织交互模型创建和分析系统的角色 行为模型。定义每个角色的职责、资源、环境、活动和服务以及它们之 间的相互关系。 第三。建立角色变迁模型。针对自适应Agent,创建和分析其角色 变迁模型。图3描述了既是巡逻者又是报警者这样一类自适应Agent 的角色变迁模型,图中节点表示组织格局。该Agent被创建时将绑定 图4机器人哨兵系统模拟 “巡逻者”角色.当它感知到危险人员预闯入营区时该Agent将挂起其 4结束语 绑定的“巡逻者”角色,而后加入“报警者”角色,当突发事件处理结束 之后它将退出“报警者”角色而后恢复其“巡逻者”角色。 本文基于Agent技术.研究开发了机器人哨兵系统,对现有的执 勤方式做了改进,将会减轻哨兵执勤的负担,能够提高部队信息化,系 统应用到营区。对部队战斗力的提升有很大的促进作用。此系统现在 仅为模拟系统.要得到实际的应用,还要结合传感器技术、机器人技术 和无线通信技术.才能达到系统预期的目标。本文的研究,为部队执勤 方式的改变提供了技术支持。 【参考文献】 『11毛新军.面向主体的软件开发.清华大学出版社,2005. 『21胡翠云,毛新军.基于Agent的模型转换及其支撑软件工具 ODAMTransformer[J].计算机工程与科学,2009,31(1 0】:64—68. [3]刘慧敏,王欢,王万森-基于Agent技术的专家系统平台的设计与实现叨.计算 机应用研究,2004,(6):l87—188. 图3既是巡逻者又是报警者的Agent及其角色变迁模型 [责任编辑:汤静】 (上接第66页) 序模块.便于程序的维护,减少了网络的通讯量。因此在数据库编程中 If@@ThnCount>@intTrCoOnEntry 运用好存储过程是十分必要的,而存储过程的严谨直接关系到整个程 begin 序的成败.从上面事例我们可以总结出存储过程正确性的完善必须很 If@intErrorCode=0 好的利用对SQL Server中提供的@@Error系统变量的访问,另外对事 COMMIT TRANSACT10N 务的理解应用及对@@TranCount的判断,也是对多用户访问过程中 Else 出现不可预知事务的出错避免。 ROLLBACK TRANSACT【0N end 【参考文献】 retum@intErrorCode [1]吕凤顺.SQI Serverd数据库基础与实训教程.清华大学出版社,2006,9. G0 [2]Dejan Sunderic.SQL Server2000 Stored procedure&XML Programming.Second Edition.McGraw—Hill Osborne Media.2003—5—16. 4结论 在SQL中存储过程能把对数据库的一系列操作封装为独立的程 [责任编辑:曹明明]