sql-server - 存储过程在 asp.net web api 中返回错误值
问题描述
1
我写了一些程序代码,它运行成功时返回值。
但是-1
当它顺利进入时,它总是返回(失败值)ASP.NET Web API
。
我SSMS
用这个案例进行了测试。
USE [MY_DATABASE]
GO
DECLARE @return_value int
EXEC @return_value = [dbo].[API_TO_WEB_CREATE_RESOURCE]
@RES_Size = 3019,
@RES_ContentType = N'image/jpeg',
@RES_OriginalName = N'evolving_google_identity_share.jpg',
@RES_GUID = N'b98bd7ee-cb19-49c8-a8dc-3b92b3210b91',
@RES_Path = N'~/Content/resources\\b98bd7ee-cb19-49c8-a8dc-3b92b3210b91',
@RES_Upload_USR_Index = NULL
SELECT 'Return Value' = @return_value
GO
这返回1
中的相同代码ASP.NET Web API
。
int result = context.API_TO_WEB_CREATE_RESOURCE(
3019,
"image/jpeg",
"evolving_google_identity_share.jpg",
"b98bd7ee-cb19-49c8-a8dc-3b92b3210b91",
"~/Content/resources\\b98bd7ee-cb19-49c8-a8dc-3b92b3210b91",
null
);
这返回-1
这是我的程序。
USE [MY_DATABASE]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:
-- Create date:
-- Description:
-- =============================================
ALTER PROCEDURE [dbo].[API_TO_WEB_CREATE_RESOURCE]
-- Add the parameters for the stored procedure here
@RES_Size int = 0,
@RES_ContentType nvarchar(100) = NULL,
@RES_OriginalName nvarchar(300),
@RES_GUID nvarchar(50),
@RES_Path nvarchar(500),
@RES_Upload_USR_Index int = NULL
AS
BEGIN
DECLARE @RES_RegisteredDatetime datetime = GETDATE()
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
BEGIN TRY
BEGIN TRAN
INSERT INTO
dbo.NS_Resource (RES_Size, RES_ContentType, RES_OriginalName, RES_GUID, RES_Path, RES_Upload_USR_Index)
VALUES (@RES_Size, @RES_ContentType, @RES_OriginalName, @RES_GUID, @RES_Path, @RES_Upload_USR_Index);
PRINT '리소스 추가됨'
COMMIT TRAN
RETURN(1);
END TRY
BEGIN CATCH
ROLLBACK TRAN
DECLARE @ERROR_Msg nvarchar = error_message()
RAISERROR('리소스 추가 중 문제 발생됨 %s', 16, 1, @ERROR_Msg)
RETURN (-1)
END CATCH
END
概括
预期的
返回值1
并成功插入新值。
实际的
- 在 SSMS 中
返回值1
并成功插入新值。
- 在 ASP.NET Web API 中(这是问题)
返回值-1
并成功插入新值。
解决方案
在一个代码模块中有多个语句从来都不是一个好主意return
,SQL 也不例外。尝试如下重写您的程序,看看它是否有帮助:
ALTER PROCEDURE [dbo].[API_TO_WEB_CREATE_RESOURCE]
-- Add the parameters for the stored procedure here
@RES_Size int = 0,
@RES_ContentType nvarchar(100) = NULL,
@RES_OriginalName nvarchar(300),
@RES_GUID nvarchar(50),
@RES_Path nvarchar(500),
@RES_Upload_USR_Index int = NULL
AS
DECLARE @RES_RegisteredDatetime datetime = GETDATE();
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
declare @Ret int = -1; -- Failure by default
BEGIN TRY
BEGIN TRAN
INSERT INTO
dbo.NS_Resource (RES_Size, RES_ContentType, RES_OriginalName, RES_GUID, RES_Path, RES_Upload_USR_Index)
VALUES (@RES_Size, @RES_ContentType, @RES_OriginalName, @RES_GUID, @RES_Path, @RES_Upload_USR_Index);
PRINT '리소스 추가됨';
COMMIT TRAN
set @Ret = 1; -- Success
END TRY
BEGIN CATCH
if @@trancount > 0
ROLLBACK TRAN;
DECLARE @ERROR_Msg nvarchar(2048) = error_message();
RAISERROR('리소스 추가 중 문제 발생됨 %s', 16, 1, @ERROR_Msg);
END CATCH;
return @Ret;
go
但是,对我来说,整个事情看起来有点麻烦。如果您从块内向客户端抛出错误catch
,这应该足够了。它将转换为 C# 中的 SQLException,因此返回值变得无关紧要。
就个人而言,我不使用返回值;相反,我通常int
为数字和nvarchar(2048)
错误消息创建 2 个输出参数,并在catch
块中分配它们的值而不重新抛出。执行完成后,我只需检查@ErrorNumber
输出参数的值,如果它既不是零也不是 NULL,我在客户端处理错误。
推荐阅读
- python - 带有下拉菜单的散景线图未链接/白屏
- javascript - 尝试分离 SQL 结果,以便我可以按百分比更改价格
- katalon - 无法在katalon中打开项目原因对象未找到异常
- arrays - Typescript catchAll getter 或实现类似数组的访问器
- c - 在内存位置中使用双指针
- javascript - 即使使用别名命令处理程序,别名也不起作用
- php - 如何使图像不会在 Laravel 中消失并保留已上传的图像?
- python - 在 django 中测试模型的绝对 URL
- java - 如何在 Dropwizard 中添加请求日志过滤器?
- linux - E: 找不到包 ea-utils | Ubuntu 18.04