逗号与双精度点与访问数据库

Posted

技术标签:

【中文标题】逗号与双精度点与访问数据库【英文标题】:comma vs point in double with an access database 【发布时间】:2015-07-29 21:43:47 【问题描述】:

在我的 C# 程序中,我使用带有 access 数据库的强类型数据集。在数据库的一个表中,我使用了一个双精度表。对于某些文化,访问使用逗号而不是点来表示双精度值。我可以毫无问题地读取该值(IE,如果访问使用逗号:“10,25”被读取为“10.25”双精度值)。但是当我想插入一个新值时,如果访问使用逗号并且其中一个值是小数,我会得到一个异常(IE“10”是插入,“10.25”抛出异常)。更新数据库时引发异常,而不是在数据集中创建新行时引发。

当我使用数据集时,我认为这些问题是由 .Net 自动处理的。

如何管理逗号/点(我认为我必须了解用户的文化,然后强制数据集使用它。但是如何?)?

PS:我无法改变计算机文化,所以我需要通过代码管理所有文化。

【问题讨论】:

请出示相关代码!您在代码中插入 10.25 的位置。 为什么你不能在使用 string.Format 函数和 string.Replace 的同时进行检查,以便如果一个包含 , 将其替换为 . 或反之亦然以及字符串.包含功能,这可以完成显示一些代码..还有为什么您的数据库在定义数据类型/格式方面没有一致地设置..显示和保存是两件不同的事情,所以这可以完成 理想情况下,您应该设置应用程序,以便当当前文化使用, 而不是. 时,它将自动处理。这可能会有所帮助:***.com/questions/518625/… ***.com/questions/5855753/… 正如我在对 Olivier Jacot-Descombes 答案的评论中解释的那样,我看不到 sql 请求。我在我的代码中只使用了 double,然后将它们传递给自动创建的数据集代码。 【参考方案1】:

请注意,双打不包含逗号或点。他们使用尾数和指数在内部以二进制表示形式存储数字。只有当你有一个双精度的字符串表示(很可能是一个 sql 字符串)时,逗号与点的问题才会发挥作用。

不要写:

// Here the double is in a string
string sql = "INSERT INTO mytable (id, value) VALUES (1, 10.25)";
using (OleDbCommand cmd = new OleDbCommand(sql, conn)) 
    cmd.CommandType = CommandType.Text;
    conn.Open();
    cmd.ExecuteNonQuery();
 

改为使用命令参数:

// Here the double is never converted to a string
string sql = "INSERT INTO mytable (id, value) VALUES (?, ?)";
using (OleDbCommand cmd = new OleDbCommand(sql, conn)) 
    cmd.CommandType = CommandType.Text;
    cmd.Parameters.AddWithValue("?", 1);
    cmd.Parameters.AddWithValue("?", 10.25);
    conn.Open();
    cmd.ExecuteNonQuery();

当然,在 C# 代码中,double 是以文本表示形式编写的。但是,在编译和运行时,double 以纯二进制形式存在,不记得代码中使用的小数分隔符的字符。

【讨论】:

我无法发布代码,因为我使用了由 visualstudio 创建的强类型数据集。我使用数据集提供的功能之一:dataset.nom_table.Addnom_tableRow(param1, param2, ...)。然后我调用 dataset.UpdateAll()。此函数为数据集中的每个表调用 this.Adapter.Update()。如果它的参数之一是带十进制的双精度,那么这个函数就会抛出执行。我怀疑 sql 请求中存在问题(我看不到数据集使用的最终 sql sdstring),类似于:UPDATE nom_table SET value=10,25

以上是关于逗号与双精度点与访问数据库的主要内容,如果未能解决你的问题,请参考以下文章

单精度与双精度的区别

为啥中位数跳闸 data.table (整数与双精度)?

SSE2:将二维数组中的有符号整数与双精度数相乘并将结果相加在 C 中

使用逗号时将字符串转换为双精度

如何格式化数据库中的双精度数据并在 Android 上使用逗号作为小数分隔符设置到 Textview

C++ 定义数组类模板