BEGIN TRY 
  [T-SQL代码写在这里] 
  END TRY 
  BEGIN CATCH 
  [异常处理代码写在这里] 
  END CATCH 

解决方案 »

  1.   

    在T-SQL中使用Try…Catch块时,你需要注意以下这些关键问题:Try块后面必须要直接接一个Catch块,否则就会发生一个错误。 
    Try…Catch不能嵌套。 
    如果Try块中的代码没有故障,将跳过Catch块,执行Catch块后的第一条语句。 
    当Catch块中的代码运行完毕后,将执行Catch块后的第一条语句。另外,当一个错误发生后,你作为一名开发者需要决定如何处理它。因为你不能像.Net语言那样,将控制权重新转回引起错误的代码上,你所能做的可能就是将问题记入日志,并将所执行的事务进行回滚。
      

  2.   

    如果是SQL Server2000只有系统全局变量@@error,如果是2005可以使用
    begin try
    ……
    end try 
    begin catch
    ……
    end catch
      

  3.   

    不行哦,BEGIN TRY 
      select cast(rtrim(ltrim(@V_Deviceid))  as  float)  
      END TRY 
      BEGIN CATCH 
      set @message='通讯号不为数字,通讯号非法,请重新输入'
      END CATCH服务器: 消息 170,级别 15,状态 1,过程 addveh,行 47
    第 47 行: 'TRY' 附近有语法错误。
    服务器: 消息 170,级别 15,状态 1,过程 addveh,行 49
    第 49 行: ' ' 附近有语法错误。
    服务器: 消息 170,级别 15,状态 1,过程 addveh,行 52
    第 52 行: ' ' 附近有语法错误。
    且try 及catch关键字都是灰色的哦
      

  4.   

    declare  @V_Deviceid varchar(10)='ab'
    declare @message nvarchar(100)BEGIN TRY
    select cast(rtrim(ltrim(@V_Deviceid))  as  float)  
    END TRY 
    BEGIN CATCH 
    set @message=N'通讯号不为数字,通讯号非法,请重新输入';
    print @message
    END CATCH /*----------------------(0 row(s) affected)通讯号不为数字,通讯号非法,请重新输入*/我用SQL Server 2008 CTP6可以执行成功的,你用的是SQL 2000版本吗?SQL2000是不支持TRY...CATCH的T-SQL的。你可以判断全局变量@@ERROR来实现。
      

  5.   

    你用的2000
    而且你的错误是数据类型错误,不能用@@error捕获
    只有这样:declare @message varchar(200)declare @V_Deviceid varchar(20)
    set @V_Deviceid='as345.33'            --错误的例子if isnumeric(rtrim(ltrim(@V_Deviceid)))=1
    select cast(rtrim(ltrim(@V_Deviceid))  as  float)  
    else 
    set @message='通讯号不为数字,通讯号非法,请重新输入' 
    print @messageset @V_Deviceid='345.33'               --正确的例子if isnumeric(rtrim(ltrim(@V_Deviceid)))=1
    select cast(rtrim(ltrim(@V_Deviceid))  as  float)  
    else 
    set @message='通讯号不为数字,通讯号非法,请重新输入' 
    print @message
      

  6.   

    我要判断从表单中的 <input name="textdeviceid" type="text" id="textdeviceid" size="11" maxlength="11" >获取输入值
    然后传入到存储过程addveh的参数@V_Deviceid 中去,由于可能碰到request.form("textdeviceid")的值有可能是
    数字与非数字的组合,或都是非数字字符的情况,所以要排除列出的情况,只要数字字符。
    那就要在存储过程中捕获异常,或通过条件判断排除不需要的数据。
    我的存储过程ADDVEH如下
    SET QUOTED_IDENTIFIER OFF 
    GO
    SET ANSI_NULLS ON 
    GOALTER    PROCEDURE addveh
    @v_no varchar(2000),
    @V_Deviceid varchar(2000),
    @V_TeamNo varchar(2000),
    @V_VehicleType varchar(2000),
    @message  varchar(2000) output
    AS
    if  substring(rtrim(ltrim(@v_no)),1,1)='粤'
    begin
    set @message ='车牌号码前请不要加‘粤’字,请重新输入'
    end
    else if exists(select * from veh where v_no=rtrim(ltrim(@V_no)))
    begin
    set @message='车牌号码重复,请重新输入'
    end
    else if exists(select * from veh where v_deviceid=rtrim(ltrim(@V_Deviceid)))
    begin
    set @message='通讯号码重复,请重新输入'
    end
    else if rtrim(ltrim(@v_no))='' 
    begin
    set @message='车牌号不允许为空,请重新输入'
    end
    else if rtrim(ltrim(@V_Deviceid))='' 
    begin 
    set @message='通讯号不允许为空,请重新输入'
    end
    else if  rtrim(ltrim(@V_TeamNo))='' 
    begin
    set @message='车队不允许为空,请重新输入'
    end
    else if rtrim(ltrim(@V_VehicleType))=''
    begin
    set @message='行业类别不允许为空,请重新输入'
    end 
    else if len(rtrim(ltrim(@V_Deviceid)))<>11
    begin
    set @message='通讯号多于或少于11位,请重新输入'
    end
    else if ISNUMERIC(rtrim(ltrim(@V_Deviceid)))=0 or substring(rtrim(ltrim(@V_Deviceid)),1,1)<>'1'
    begin
    set @message='通讯号不为数字或通讯号首字不为1,通讯号非法,请重新输入'
    end if rtrim(ltrim(@v_no))<>'' and len(rtrim(ltrim(@V_Deviceid)))=11 and rtrim(ltrim(@V_TeamNo))<>'' AND rtrim(ltrim(@V_VehicleType))<>''and substring(rtrim(ltrim(@v_no)),1,1)<>'粤'and not exists(select * from veh where v_no=rtrim(ltrim(@V_no))) and not exists(select * from veh where v_deviceid=rtrim(ltrim(@V_Deviceid)))
    if ISNUMERIC(rtrim(ltrim(@V_Deviceid)))=1 and substring(rtrim(ltrim(@V_Deviceid)),1,1)='1'
    begin
    insert into veh(V_No,V_Deviceid,V_TeamNo,V_VehicleType) values(rtrim(ltrim(@v_no)),rtrim(ltrim(@V_Deviceid)),rtrim(ltrim(@V_TeamNo)),rtrim(ltrim(@V_VehicleType)))
    insert into vehsend(v_no) values('粤'+rtrim(ltrim(@v_no)))
    end
    GO
    SET QUOTED_IDENTIFIER OFF 
    GO
    SET ANSI_NULLS ON 
    GO但当我我在表单中文本字段<input name="textdeviceid" type="text" id="textdeviceid" size="11" maxlength="11" >中输入非数字字符或数字与非数字字符的组合时,提交表单后出现错误提示:
    Microsoft OLE DB Provider for ODBC Drivers '80040e57' [Microsoft][ODBC SQL Server Driver]字符串数据,右截位 \wwwroot\mygps\veh.asp, line 119麻烦各位大哥给我看看,能不能解决这个问题,谢谢
      

  7.   

    但当我我在表单中文本字段 <input name="textdeviceid" type="text" id="textdeviceid" size="11" maxlength="11" >中输入非数字字符或数字与非数字字符的组合时,提交表单后出现错误提示: 
    Microsoft OLE DB Provider for ODBC Drivers '80040e57' [Microsoft][ODBC SQL Server Driver]字符串数据,右截位 \wwwroot\mygps\veh.asp, line 119 麻烦各位大哥给我看看,能不能解决这个问题,谢谢 
    非数字字符或是数字字符与非数字符的组合的长度少于11时不会报错。麻烦帮我解决一下谢谢
      

  8.   

    不要将data validation的任务放到服务器端完成,在验证表单的时候(在客户端页面),就应该做这样的验证,保证入库的数据是数字类型。
    试着修改你的<input>标签<input onkeyup="value=value.replace(/[^\d]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))">
      

  9.   

    帮助里的,语法:
    BEGIN TRY
         { sql_statement | statement_block }
    END TRY
    BEGIN CATCH
              [ { sql_statement | statement_block } ]
    END CATCH
    [ ; ]异常部分:
    在 CATCH 块的作用域内,可以使用以下系统函数来获取导致 CATCH 块执行的错误消息: 
    ERROR_NUMBER() 返回错误号。
    ERROR_SEVERITY() 返回严重性。
    ERROR_STATE() 返回错误状态号。
    ERROR_PROCEDURE() 返回出现错误的存储过程或触发器的名称。
    ERROR_LINE() 返回导致错误的例程中的行号。
    ERROR_MESSAGE() 返回错误消息的完整文本。 该文本可包括任何可替换参数所提供的值,如长度、对象名或时间。
      

  10.   

    因为你需要的数据是纯数字的,因此夹带字符的数据是脏数据,需要在到达数据库之前“清洗”干净。这不仅是保证数据安全的需求,也是降低数据库性能压力的要求。所以,怎么保证数据到达数据库之前是符合要求的呢?那么在表单提交之前做一下过滤,就可以了。上面<input>标签后面的内容就是过滤掉了所有非数字字符。你把它复制到一个html文件中试试就会发现,你是输入不了非数字字符的。你也可以用你自己的方法实现数据“清洗”。
      

  11.   

    我用的是sql 2000异常捕获好象行不通
    最好是能排除在表单文本字段 <input name="textdeviceid" type="text" id="textdeviceid" size="11" maxlength="11" >中输入非数字字符或数字与非数字字符的组合,
      

  12.   

    好,是不是<input name="textdeviceid" type="text" id="textdeviceid" size="11" maxlength="11" onkeyup="value=value.replace(/[^\d]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))">
    这样就可以拉啊
      

  13.   

    不要将data validation的任务放到服务器端完成,在验证表单的时候(在客户端页面),就应该做这样的验证,保证入库的数据是数字类型。 
    试着修改你的 <input>标签 
    HTML code<input onkeyup="value=value.replace(/[^\d]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))">若要数字或是数字与字母的组合呢,也就是屏蔽汉字字符怎么解决。