我有一个使用事务的sql查询,它使用return来指示失败或成功,如下所示:
BEGIN
DECLARE @intErrorCode INT;
DECLARE @emailAutoIncrement INT;
BEGIN TRAN
INSERT INTO Accounts ( blabla, blabla2 )
VALUES ( somevalue, somevalue2 )
Select @intErrorCode = @@ERROR
if (@intErrorCode <> 0) GOTO PROBLEM
COMMIT TRAN
RETURN 1
PROBLEM:
if (@intErrorCode <> 0) Begin
Rollback Tran
RETURN 0
END
END在代码中,我使用了sqlCommand.ExecuteScalar(),我认为这将给我1或0,但这总是返回false。另外,我遇到的另一个问题是,当sql中发生异常时,程序本应返回0,但实际上却返回了异常。
所以RETURN 0是无用的,因为它总是被异常覆盖?
为了添加更多信息,sql查询是一个存储过程,其名称如下:
myCommand.CommandText = "createAccount";
myCommand.CommandType = CommandType.StoredProcedure;
//Add parameters here
using (myReader)
{
var test = myCommand.ExecuteScalar();
}发布于 2012-04-26 19:53:03
尝试SELECT而不是RETURN
BEGIN
DECLARE @intErrorCode INT;
DECLARE @emailAutoIncrement INT;
BEGIN TRAN
INSERT INTO Accounts ( blabla, blabla2 )
VALUES ( somevalue, somevalue2 )
SET @intErrorCode = @@ERROR
if (@intErrorCode <> 0) GOTO PROBLEM
COMMIT TRAN
SELECT 1
PROBLEM:
if (@intErrorCode <> 0) Begin
Rollback Tran
SELECT 0
END
END我也变了
SELECT @intErrorCode = @@ERROR至
SET @intErrorCode = @@ERROR发布于 2012-04-26 19:53:01
尝试而不是返回1以使用Select 1
对于MSSQL中的第二个问题,建议使用try catch块。
这是我使用的,不知道它是不是最好的做法,但它允许更多的可能性,你可以记录错误,自定义文本的消息
BEGIN TRY...
END TRY
BEGIN CATCH
declare @ErrorMessage nvarchar(4000),@ErrorSeverity int,@ErrorState int
select @ErrorMessage = ERROR_MESSAGE(),@ErrorSeverity = ERROR_SEVERITY(),@ErrorState=ERROR_STATE()
set @ErrorState=case when isnull(@ErrorState,0) <1 then 1 else @ErrorState end
raiserror (@ErrorMessage, @ErrorSeverity, @ErrorState);
END CATCHhttps://stackoverflow.com/questions/10332598
复制相似问题