私は本当に奇妙な問題を抱えています。次のパラメーターを持つストアド プロシージャがあります。
@Id int OUTPUT,
@DataSourceId int,
@OwnerId int,
@Size numeric(16,6),
@SizeUnitId int,
@LayCanFrom datetime,
@LayCanTo datetime,
@DischargeDate datetime,
@IMO int,
@ProductIds inttable readonly,
@LoadPortIds inttable readonly,
@DischargePortIds inttable readonly,
@LoadCountryIds inttable readonly,
@DischargeCountryIds inttable readonly,
@LoadZoneIds inttable readonly,
@DischargeZoneIds inttable readonly,
@FreightRate numeric(16,6),
@FreightRateUnitId int,
@StateId int,
@OriginalMessage varchar(max),
@Comments varchar(max) = null
ここで注目する特定のパラメータは @Size numeric(16,6) です。C# 側では、ストアド プロシージャを呼び出すときに、param を次のように宣言しています。
var paramSize = command.Parameters.AddParameter("@Size", this.Size);
paramSize .SqlDbType = SqlDbType.Decimal;
paramSize .Size = 16;
paramSize .Precision = 6;
次のように接続文字列を取得しています:
using (var connection = new SqlConnection(
(context.Connection as EntityConnection).StoreConnection.ConnectionString))
{
// Call function to execute the stored proc.
}
次に、接続を開き、通常どおりcommand.ExecuteNonQuery();
@Size が 75000.000000 として渡されます。フィールドは数値 (16,6) であるため、これで問題ありません。実際、同じテーブルに既にレコードがあり、そのサイズ列には 75000.000000 のような値があります。しかし、私が呼び出すとcommand.ExecuteNonQuery();
、それは戻ってきます
パラメータ値 '75000.000000' は範囲外です。
そのため、パラメーターを渡す代わりに、ストアド プロシージャの @Size をデフォルトで 75000.000000 にすることにしました。そして、何を推測しますか?できます!もう 1 つの興味深い点は、SQL プロファイラーを使用して SP の実行をキャプチャしようとしていることです。何を試しても、どのイベントをキャプチャに選択しても、SP の実行を確認できません。これは、EF storeconnection から接続文字列を取得しているためですか? 誰もこのようなことに遭遇したことがありますか?これは私を少し夢中にさせています!:)