我正在为我的项目使用 ASP.NET MVC 3 和 SQL SERVER 2008。存储过程是使用实体框架声明的。
我已经从.Net成功调用了一些SQL存储过程,但是其中一个出现了奇怪的行为......
SQL部分:
ALTER PROCEDURE [dbo].[UPD_OR_CRE]
@ID int, -- Create element if null, update if not null
@other_paramters ...,
AS
BEGIN
SET NOCOUNT ON; -- I also tried with OFF : same effect
Declare
@result int,
@resultbigint bigint;
IF (@ID is not null)
BEGIN
-- @ID is not null => update
BEGIN TRY
update TABLE
set
...
where ID = @ID
;
set @result = @ID;
END TRY
BEGIN CATCH
-- catching some error.
END CATCH;
END
ELSE
BEGIN
-- @ID is null => create
exec @result = CREATE_FUNCTION ... ;
-- CREATE_FUNCTION return the new ID
-- set @result = 56; -- hard coded for test
END
-- I put here for test a write in a journal table : @result is always correct
select @result "RESULT";
END
.Net 部分:
Int32? iD = null;
ObjectResult<Nullable<global::System.Int32>> coll = _db.UPD_OR_CRE(parameters ...);
iD = coll.ElementAt(0);
工作始终由存储过程(更新或创建)完成,当我调用更新时,我可以在.Net 中取回 iD(与在这种情况下调用时相同),当我调用创建时,我总是在 .NET 中得到 iD = 1,即使我使用“set @result = 56;”进行硬编码也是如此 在 CREATE_FUNCTION 之后。
当我删除 CREATE_FUNCTION 调用时,硬编码的结果会出现在 .Net 中(例如这里是 56)。
我认为问题可能来自整数格式(在某些情况下,@result 在 CREATE_FUNCTION 中为 bigint 更改,但它的值始终保持 int 兼容),但我进行了很多其他测试以将 @result 转换回 Int 但没有成功(而且我仍然不明白为什么在这种情况下它会返回“1”..)。这些测试的示例
exec @resultbigint = CREATE_FUNCTION ... ;
-- (one of the following lines)
set @result = (select cast(cast(@resultbigint as varchar) as int));
set @result = convert(int,@resultbigint);
set @result = (select cast(@resultbigint as int));
当然,答案可能是重写 CREATE_FUNCTION 以获得 Int 作为回报,但这涉及很多其他工作......
任何帮助、跟踪或想法将不胜感激......
菲利普