我有使用 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相关
我尝试过的:
decimal
代替decimal(19,9)
SetParam()
方法添加了精度和比例,以将这些值添加到 OleDbParameter
numeric(19,9)
。 (我知道它与十进制相同,但这只是一个疯狂的猜测,因为我不知道出了什么问题)Convert.ToDecimal(row.CurrencyRate)
:service.SetParam("@CurrencyRate", Convert.ToDecimal(row.CurrencyRate ?? 0.0m));
在调试中我看到
DataSourceType = DBTYPE_Decimal
和DataType = System.Decimal
,可能精度有问题,但我可以看到小数适合(19,9)大小
有什么想法可以消除此数据不匹配错误吗?
对我来说绝对不明显,但我必须将 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