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来实现。
你用的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
我要判断从表单中的 <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麻烦各位大哥给我看看,能不能解决这个问题,谢谢
但当我我在表单中文本字段 <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时不会报错。麻烦帮我解决一下谢谢
Try…Catch不能嵌套。
如果Try块中的代码没有故障,将跳过Catch块,执行Catch块后的第一条语句。
当Catch块中的代码运行完毕后,将执行Catch块后的第一条语句。另外,当一个错误发生后,你作为一名开发者需要决定如何处理它。因为你不能像.Net语言那样,将控制权重新转回引起错误的代码上,你所能做的可能就是将问题记入日志,并将所执行的事务进行回滚。
begin try
……
end try
begin catch
……
end catch
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关键字都是灰色的哦
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来实现。
而且你的错误是数据类型错误,不能用@@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
然后传入到存储过程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麻烦各位大哥给我看看,能不能解决这个问题,谢谢
Microsoft OLE DB Provider for ODBC Drivers '80040e57' [Microsoft][ODBC SQL Server Driver]字符串数据,右截位 \wwwroot\mygps\veh.asp, line 119 麻烦各位大哥给我看看,能不能解决这个问题,谢谢
非数字字符或是数字字符与非数字符的组合的长度少于11时不会报错。麻烦帮我解决一下谢谢
试着修改你的<input>标签<input onkeyup="value=value.replace(/[^\d]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))">
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() 返回错误消息的完整文本。 该文本可包括任何可替换参数所提供的值,如长度、对象名或时间。
最好是能排除在表单文本字段 <input name="textdeviceid" type="text" id="textdeviceid" size="11" maxlength="11" >中输入非数字字符或数字与非数字字符的组合,
这样就可以拉啊
试着修改你的 <input>标签
HTML code<input onkeyup="value=value.replace(/[^\d]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))">若要数字或是数字与字母的组合呢,也就是屏蔽汉字字符怎么解决。