OleDbCommand 的十进制标准表达式中的数据类型不匹配

问题描述 投票:0回答:1

我有使用 OleDbCommand 创建 dbf 表的 C# 代码:

service.SetCommand($@"CREATE TABLE {RequestTableName} (
CurrencyRate decimal(19,9) null,
/*some more fields*/)");

创建表后,我将值插入表中:

 service.SetCommand(
                $@"INSERT INTO {RequestTableName} 
(CurrencyRate) 
VALUES
( @CurrencyRate)");

 service.SetParam("@CurrencyRate", row.CurrencyRate ?? 0.0m);

现在在

_command.ExecuteNonQuery();
我得到:“条件表达式中的数据类型不匹配”。我尝试插入表中的值:
row.CurrencyRate = 91.1235

此代码适用于浮点类型:

CurrencyRate float null
row.CurrencyRate
double?
),我所做的唯一更改是将创建表sql中的类型更改为
CurrencyRate decimal(19,9) null
,并将
row.CurrencyRate
更改为
decimal?
。我需要小数点前 10 个数字和小数点后 9 个数字(这样的数字:1234567890.123456789)

我尝试使用

service.SetParam("@CurrencyRate", 0);
运行代码 - 它运行良好,没有错误,所以我假设其他字段不是错误的原因,问题与CurrencyRate相关

我尝试过的:

  1. 在建表sql中使用
    decimal
    代替
    decimal(19,9)
  2. 向我的
    SetParam()
    方法添加了精度和比例,以将这些值添加到
    OleDbParameter
  3. 用过
    numeric(19,9)
    。 (我知道它与十进制相同,但这只是一个疯狂的猜测,因为我不知道出了什么问题)
  4. 使用sql脚本创建表并尝试插入相同的数据,当我不使用代码手动完成时没有出现错误。并检查号码 1234567890.123456789 是否适合数据库。
  5. 在 SetParam 中添加
    Convert.ToDecimal(row.CurrencyRate)
    service.SetParam("@CurrencyRate", Convert.ToDecimal(row.CurrencyRate ?? 0.0m));
  6. 检查表和插入查询中的列顺序

在调试中我看到

DataSourceType = DBTYPE_Decimal
DataType = System.Decimal
,可能精度有问题,但我可以看到小数适合(19,9)大小

有什么想法可以消除此数据不匹配错误吗?

c# insert decimal type-mismatch oledbcommand
1个回答
0
投票

对我来说绝对不明显,但我必须将 OleDbType 从十进制覆盖为货币:

service.SetParam("@CurrencyRate", row.CurrencyRate ?? 0.0m, OleDbType.Currency);

SetParam代码在哪里:

public void SetParam(string name, object value, OleDbType? oleDbTypeOverride = null) 
        {
            var parameter = new OleDbParameter(name, value ?? DBNull.Value);
            if (oleDbTypeOverride != null)
            {
                parameter.OleDbType = oleDbTypeOverride.Value;
            }

            _command.Parameters.Add(parameter); 
            
        }

在这里找到解决方案:https://forum.hibernate.org/viewtopic.php?p=2391147

© www.soinside.com 2019 - 2024. All rights reserved.