0

プロジェクトでASP.NETMVC3とSQLSERVER2008を使用しています。ストアドプロシージャは、EntityFrameworkで宣言されています。

すでにいくつかのSQLストアドプロシージャが.Netから正常に呼び出されていますが、そのうちの1つで奇妙な動作が発生します...

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)。

問題は整数形式に起因する可能性があると思います(場合によっては、CREATE_FUNCTIONで@resultが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

私はついに問題を見つけました。フォーマットの問題ではありません。

呼び出されたプロシージャの 1 つ (CREATE_FUNCTION の背後) では、テーブル アクセス テストの要求でした (try catch で「テーブルからトップ 1 を選択する」など)。

このリクエストを影響のあるものに変更するまで問題が発生しました(同じトライキャッチで「select @toto = count(*) from table」のようなもの)

少なくとも呼び出しが .Net から行われた場合、SQL Server は一連のストアド プロシージャで多くの単純な選択を管理できないようです。

于 2013-03-10T15:55:28.847 に答える
0

データベースの第一人者ではありませんが、テストのためだけに、ストアドプロシージャの他の部分を次のように変更します。

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 に答える