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# 方面,当我调用存储过程时,我将参数声明为:

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(); Now @Size 作为 75000.000000 传入,这应该没问题,因为该字段是 numeric(16,6)。事实上,我已经在同一个表中有记录,在该 Size 列中有类似 75000.000000 的值。但是,当我打电话时command.ExecuteNonQuery();,它会返回

参数值“75000.000000”超出范围。

因此,我决定将存储过程中的 @Size 默认设置为 75000.000000,而不是传入参数。你猜怎么着?有用!另一个有趣的事情是我正在尝试使用 SQL Profiler 捕获 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] )] 

第一个数字是精度,第二个数字是比例。因此,@Size numeric(16,6)意味着“精度为 16,比例为 6”。

你也混淆了这一点。

于 2013-04-02T11:29:25.403 回答