【问题标题】:Insert decimal value into Currency Access field将十进制值插入货币访问字段
【发布时间】:2015-01-18 00:09:31
【问题描述】:

简短背景:我正在用基于 C# 的程序替换一个过时的基于 Visual 的程序。该程序附带了一个基于 Access (JET) 的数据库,该数据库已经在使用中。现在,出于实际原因,我想连接到当前数据库。但是在可预见的将来,我想用 SQL Server 替换它。

问题:数据库使用 Access 'Currency' 数据类型存储财务信息。在 C# 中,我使用“十进制”来表示财务信息。自然,当我尝试使用 INSERT 或 UPDATE 查询将 Decimal 存储在 Currency-field 中时,我会遇到错误(实际上,我遇到过一次错误,它会自动将该特定记录的数据类型更改为 Decimal)。我不确定解决此问题的最佳方法是什么:

  1. 在我的程序中将小数转换为货币并在之后插入。这甚至可能吗(C# 表示该字段的值是 DBNull 类型,因为它不知道货币)?如果是,我该怎么做?
  2. 将字段的数据类型更改为十进制。 这样做是否会冒损坏财务信息的风险?
  3. 还有其他/更好的建议吗?

提前致谢!


确切的错误信息:

System.Data.Odbc.OdbcException (0x80131937): ERROR [07006] 
[Microsoft][ODBC Microsoft Access-stuurprogramma]Inbreuk op kenmerk van beperkt gegevenstype

它是荷兰语,翻译成Restricted data type attribute violation

我的更新代码:

public Boolean setFuelCosts(int rentID, Decimal fuelcosts)
        {
            string conString = lem2;
            string queryString = "UPDATE rental SET fuel = ? WHERE rentid = ?";
            OdbcCommand command = new OdbcCommand(queryString);
            command.Parameters.Add("@fuel", OdbcType.Decimal).Value = fuelcosts;
            command.Parameters.Add("@rentid", OdbcType.Int).Value = rentID;
            return factory.executeUpdateCommand(conString, command);
        }

public Boolean executeUpdateCommand(String conString, OdbcCommand command)
        {
            bool result = false;
            using (OdbcConnection connection = new OdbcConnection(conString))
            {
                try
                {
                    command.Connection = connection;
                    command.CommandType = CommandType.Text;
                    connection.Open();
                    int i = command.ExecuteNonQuery();
                    result = (i >= 1);
                    connection.Close();
                }
                catch (Exception exc)
                {
                    System.Windows.Forms.MessageBox.Show(exc.Message);
                    System.Windows.Forms.MessageBox.Show(exc.StackTrace);
                }
            }
            return result;
        }

【问题讨论】:

  • 您尝试插入值的代码示例以及收到的确切错误消息将在此处提供很大帮助(Access 版本?)
  • 您是否尝试将变量作为类型发送:OleDbType.Currency?
  • 我已经添加了我的代码和错误消息。 Access 版本是 97(就像我说的,已经过时了)。 @OmerBTW:我用的是Odbc,所以恐怕不行。

标签: c# ms-access type-conversion


【解决方案1】:

在 .NET 中使用 System.Data.Odbc 处理 Currency 字段时,您的问题似乎是 Access ODBC 驱动程序的限制。 OdbcDataReader 会将这些字段返回System.Decimal(如果值不为 NULL),但 System.Data.Odbc 显然不会接受 Currency 字段的 System.Decimal 参数。

作为一种解决方法,您可以替换

command.Parameters.Add("@fuel", OdbcType.Decimal).Value = fuelcosts;

command.Parameters.Add("@fuel", OdbcType.NVarChar).Value = fuelcosts.ToString("0.0000");

我刚刚在 C# 2010 中针对 Access 2000 数据库文件进行了测试,它对我有用。

【讨论】:

  • 进一步测试发现InvariantCulture在某些情况下实际上会导致更新失败,所以我从答案中删除了它。
  • 我知道这个问题(和答案)已经很老了,但是如果有人遇到这种情况并且他使用 Dapper,那么语法如下:connection.Execute(queryString, new { fuel = new DbString { Value = fuelcosts.ToString("0.000"), Length = 50 }, id = rentID });
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-19
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多