0

私は本当に奇妙な問題を抱えています。次のパラメーターを持つストアド プロシージャがあります。

@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 から接続文字列を取得しているためですか? 誰もこのようなことに遭遇したことがありますか?これは私を少し夢中にさせています!:)

4

1 に答える 1

3

Scale代わりに設定する必要がありSizeます:

paramSize.Precision = 16;
paramSize.Scale = 6;

decimalまた、 (または) は次のようnumericに定義されていることに注意してください。

 decimal [ (p[ ,s] )] and numeric[ (p[ ,s] )] 

最初の数値は精度で、2 番目の数値は位取りです。したがって、@Size numeric(16,6)「精度は 16、スケールは 6」を意味します。

あなたもこれを混乱させています。

于 2013-04-02T11:29:25.403 に答える