Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 更新类型化数据集表时条件表达式中的数据类型不匹配';s排_C#_Ms Access_Type Conversion_Insert Update_Strongly Typed Dataset - Fatal编程技术网

C# 更新类型化数据集表时条件表达式中的数据类型不匹配';s排

C# 更新类型化数据集表时条件表达式中的数据类型不匹配';s排,c#,ms-access,type-conversion,insert-update,strongly-typed-dataset,C#,Ms Access,Type Conversion,Insert Update,Strongly Typed Dataset,我有一个类型化数据集,其中有一个示例数据表,其中有一个整数ID字段和一个十进制价格字段: 源数据库是一个MS Access mdb文件。 当我更新价格字段时,如果MS Windows系统范围的十进制符号设置为逗号,我会收到“条件表达式中的数据类型不匹配”错误消息: 如果MS Windows系统范围的十进制符号设置为点,则我的测试效果良好: 问题:我的示例代码的最小更正是什么 TestTableAdapter adapter = new TestTableAdapter(); Console

我有一个类型化数据集,其中有一个示例数据表,其中有一个整数ID字段和一个十进制价格字段:

源数据库是一个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]); 
要使其独立于系统范围的十进制符号设置值正常工作,以下使用“伪”参数的“技巧”似乎解决了这个问题。每个“假”参数都必须提供一个自定义的“转换器”代码行-下面只是示例案例的解决方案,而不是通用解决方案。它可以推广,但我仍然希望找到更简单和通用的解决方案:

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]);
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]);

以下是一个通用解决方案:

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]);
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]);

这个解决方案是我在这里做的一些测试和对这个主题的评论的结果。

我个人会远离类型化数据集。。为什么不将SqlDataAdapter与dataset/datatable一起使用以利用Fill()方法并编写代码来执行更新等操作呢。。会少很多headache@MethodMan:谢谢。我的问题是关于某个用例及其问题及其可能的最小努力解决方案——我的问题不是关于编程偏好。我的意思是,我知道如何使用非类型化的数据集来解决这个问题,但这不是我正在寻找的一个最简单的解决方案。您似乎遇到了所讨论的访问OLEDB提供程序中的缺陷。您最省力的解决方案很可能是按照@MethodMan的建议去做,并停止使用TableAdapter,或者改用OdbcDataAdapter。@Gord Thompson:这是Access OLEDB提供程序的问题还是在运行时生成实际更新命令的问题?这是Access OLEDB提供程序影响字段(列)的问题在访问表中定义为
十进制
。该问题似乎不会影响定义为
货币的字段。这也不是DataAdapter对象的一般问题,因为使用OleDbDataAdapter将失败,但使用OdbcDataAdapter将正常工作。