プロジェクトで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を取得することですが、これには他の多くの作業が含まれます...
ヘルプ、トラック、アイデアをいただければ幸いです...
フィリップ