我有一个带有一个样本数据表的类型化数据集,其中包含一个Integer ID字段和一个十进制Price字段:
源数据库是MS Access mdb文件。 当我更新价格字段时,如果MS Windows系统范围的十进制符号设置为逗号,则表示“数据类型不匹配标准表达式”错误消息:
如果MS Windows系统范围的十进制符号设置为点,我的测试效果很好:
问题:我的示例代码的最小更正是什么:
TestTableAdapter adapter = new TestTableAdapter();
ConsoleApplication2.SampleDataSet.TestDataTable table = adapter.GetData();
table[0].Price = 1.23m;
adapter.Update(table[0]);
使其工作良好,与系统范围的十进制符号设置值无关?
答案 0 :(得分:0)
以下"技巧"使用"假"参数似乎正在解决主题问题。每一个"假"参数必须提供自定义"转换器"代码行 - 下面只是样本案例的解决方案而不是通用解决方案。它可以推广,但我仍然期望找到更简单和通用的解决方案:
var adapter = new TestTableAdapter();
adapter.Adapter.RowUpdating +=
new System.Data.OleDb.OleDbRowUpdatingEventHandler((sender, e) =>
{
// UPDATE [Test] SET [Price] = {{Price}} WHERE [ID] = @id
// {{Price}} is a fake parameter to be replaced by custom code
e.Command.CommandText = e.Command.CommandText.Replace("{{Price}}",
string.Format(new System.Globalization.CultureInfo("en-US"),
"{0:#0.00}",
e.Row["Price"]));
}
);
ConsoleApplication2.SampleDataSet.TestDataTable table = adapter.GetData();
table[0].Price = 1.23m;
adapter.Update(table[0]);
答案 1 :(得分:0)
这是一个通用的解决方案:
var adapter = new TestTableAdapter();
adapter.Adapter.RowUpdating += new System.Data.OleDb.OleDbRowUpdatingEventHandler(
(sender, e) =>
{
foreach (System.Data.OleDb.OleDbParameter parameter in e.Command.Parameters)
if (parameter.DbType == System.Data.DbType.Decimal)
parameter.OleDbType = System.Data.OleDb.OleDbType.Currency;
}
);
ConsoleApplication2.SampleDataSet.TestDataTable table = adapter.GetData();
table[0].Price = 3.75m;
adapter.Update(table[0]);
此解决方案是Gord Thompson提供的对此主题的评论以及我在此处进行的一些测试的结果。