0

我正在为我的项目使用 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 作为回报,但这涉及很多其他工作......

任何帮助、跟踪或想法将不胜感激......

菲利普

4

2 回答 2

1

我终于找到了问题所在。不是格式问题。

在一个被调用的过程中(在 CREATE_FUNCTION 之后),它是对表访问测试的请求(类似于 try catch 中的“从表中选择前 1 个”)

直到我将这个请求更改为一个做作的请求(类似“select @toto = count(*) from table”在同一个 try catch 中)之前,问题才出现

至少当从 .Net 调用时,SQL Server 似乎无法在一组存储过程中管理许多简单的选择;

于 2013-03-10T15:55:28.847 回答
0

我不是数据库的专家,但如果只是为了测试你修改存储过程的 else 部分,比如

ELSE
    BEGIN
     Begin tran
      --exec @result = CREATE_FUNCTION ... ; 
      insert into Table(COL) values('someValue')

      if @@error <>0
        begin
          rollback
        end

      set @result = SCOPE_IDENTITY()
     commit
    END

select @result "RESULT";

你的问题将得到解决

于 2013-03-08T18:49:39.833 回答