我正在以下列方式编写存储过程..
CREATE PROCEDURE spTest
@intCompId int,
@varCompName varchar(50)
AS
BEGIN
BEGIN TRANSACTION
BEGIN TRY
INSERT INTO tblCompanyMaster(CompId,CompName)
VALUES (@intCompId,@varCompName)
IF(@@ERROR<>0)
RAISERROR('Error',10,1)
SELECT ERROR_MESSAGE()
IF(@@ERROR=0)
BEGIN
COMMIT TRANSACTION
SELECT 0;
END
ELSE
ROLLBACK TRANSACTION
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
END CATCH
END
GO
我这种情况如果发生错误,它将返回错误消息。我从前端使用sqlcommand属性调用此sp,如oSqlcommand.executeNonQuery();它将返回没有受影响的行,否则返回零。现在我想要的是,如果存储过程中出现任何错误,那么error_message()返回的消息应作为异常在前端捕获,因为我在文本文件中编写每个异常。我怎样才能在前端抓住这条消息? 我的编码风格如下....
try
{
//Some code
}
catch(exception ex)
{
//Write exception in text file.
}
我想在ex。
处理该消息答案 0 :(得分:6)
您的存储过程包含一个基本缺陷:
如果在检查@@ERROR
(或@@ROWCOUNT
)的值后执行任何语句,它将重置为零。
在继续之前,您应始终缓存在本地变量中:
DECLARE @errornum int
SET @errornum = @@ERROR
如果您还需要rowcount,那么您必须在单个语句中执行,如此
SELECT @errornum = @@ERROR, @rowcount = @@ROWCOUNT
此外,您不需要混合使用TRY/CATCH
和检查@@ERROR
如果要处理存储过程中的错误,请使用TRY/CATCH
,例如:
BEGIN TRY
-- ...
-- Do Stuff
-- ...
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() AS ErrorNumber
,ERROR_MESSAGE() AS ErrorMessage;
END CATCH
在您的C#代码中,抓住SqlException