逗号与带有访问数据库

时间:2015-07-29 21:43:47

标签: c# ms-access double point comma

在我的C#程序中,我使用带有访问数据库的强类型数据集。在DB的一个表中,我使用了一个double。对于某些文化,访问使用逗号而不是双值的点。我可以毫无问题地读取值(IE如果访问使用逗号:" 10,25"读作" 10.25"双值)。但是当我想插入一个新值时,如果访问使用逗号并且其中一个值是小数,则会出现异常(IE" 10"是插入," 10.25" throw例外)。更新数据库时抛出异常,而不是在数据集中创建新行时抛出异常。

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

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

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

1 个答案:

答案 0 :(得分: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以纯二进制形式存在,而不记住代码中使用的小数分隔符的字符。