3

我在 c# 中有这个问题,我想将字符串转换为双精度。

textBoxKostOnderhoud.Text = "0.08";

kost.OnderhoudKost = double.Parse(textBoxKostOnderhoud.Text);

这使我的数据库中有 80.00,我不知道为什么。这个问题有什么解决办法吗?

这就是我将值添加到数据库(mysql)的方式

public bool insert(Kost kost)
{
    string query = "INSERT INTO kost (wagenId, onderhoudKost, tolKost, bedrijfsVerzekering, autoVerzekering, ladingVerzekering, wegenBelasting, eurovignet, accountantKost, telefoonKost, documentenEnVergunningen, onvoorzien, overige, andere) VALUES('" + kost.WagenId + "', '" + kost.OnderhoudKost + "', '" + kost.TolKost + "', '" + kost.BedrijfsVerzekering + "', '" + kost.AutoVerzekering + "', '" + kost.LadingVerzekering + "', '" + kost.WegenBelasting + "', '" + kost.Eurovignet + "', '" + kost.AccountantKost + "', '" + kost.TelefoonKost + "', '" + kost.DocumentenEnVergunningen + "', '" + kost.Onvoorzien + "', '" + kost.Overige + "', '" + kost.Andere + "')";

    if (this.OpenConnection())
    {
        //Create Command
        MySqlCommand cmd = new MySqlCommand(query, connection);
        //Create a data reader and Execute the command
        cmd.ExecuteReader();

        //close Connection
        this.CloseConnection();

        return true;
    }
    else
    {
        return false;
    }
}

sql

CREATE TABLE IF NOT EXISTS `kost` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `wagenId` int(11) NOT NULL,
  `onderhoudKost` double(10,2) NOT NULL,
  `tolKost` double(10,2) NOT NULL,
  `bedrijfsVerzekering` double(10,2) NOT NULL,
  `autoVerzekering` double(10,2) NOT NULL,
  `ladingVerzekering` double(10,2) NOT NULL,
  `wegenBelasting` double(10,2) NOT NULL,
  `eurovignet` double(10,2) NOT NULL,
  `accountantKost` double(10,2) NOT NULL,
  `telefoonKost` double(10,2) NOT NULL,
  `documentenEnVergunningen` double(10,2) NOT NULL,
  `onvoorzien` double(10,2) NOT NULL,
  `overige` double(10,2) NOT NULL,
  `andere` double(10,2) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `wagenId` (`wagenId`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=64 ;
4

3 回答 3

19

我怀疑您使用的文化是小数点分隔符是“,”,分组分隔符是“。”。

您可以指定解析时使用的文化:

double d = double.Parse(s, CultureInfo.InvariantCulture);

这是否合适取决于上下文,通常 - 字符串来自哪里?如果是用户,你知道他们的文化是什么吗?如果它不是来自用户,那么数据源本身是否是文本的,或者有没有一种方法可以在没有任何字符串转换的情况下获得值?

请注意,如果这是针对货币价值,您几乎肯定应该使用decimal而不是double.

编辑:现在您已经包含了 SQL,我们可以看到为什么该值没有正确传播到数据库:

// Note properly broken, but this is all on one line. (Ick to start with.)
string query = "INSERT INTO kost (wagenId, onderhoudKost, tolKost, 
   bedrijfsVerzekering, autoVerzekering, ladingVerzekering, wegenBelasting, 
   eurovignet, accountantKost, telefoonKost, documentenEnVergunningen, onvoorzien, 
   overige, andere) VALUES('" + kost.WagenId + "', '" + kost.OnderhoudKost + "', '" 
   + kost.TolKost + "', '" + kost.BedrijfsVerzekering + "', '" +
   kost.AutoVerzekering + "', '" + kost.LadingVerzekering + "', '" + 
   kost.WegenBelasting + "', '" + kost.Eurovignet + "', '" + kost.AccountantKost + 
   "', '" + kost.TelefoonKost + "', '" + kost.DocumentenEnVergunningen + "', '" + 
   kost.Onvoorzien + "', '" + kost.Overige + "', '" + kost.Andere + "')";

您正在将所有值转换为SQL中的字符串,并希望您的数据库能够以相同的方式再次解析它们。碰巧的是,由于您的默认文化,它不会再发生。

更重要的是,这里有一个大规模的 SQL 注入攻击漏洞。

不要这样做。请改用参数化 SQL,在 SQL 中放置占位符,然后分别指定参数值。好处:

  • 防止 SQL 注入攻击
  • 通过将代码(SQL)与数据分离,让您的 SQL 语句更加简洁
  • 减少您最终进行的转换次数,因此您不必担心文化等问题

有关用于参数的确切格式,请参阅您正在使用的 MySQL 驱动程序的文档(我相信根据驱动程序的不同,格式可能会略有不同) - 但从根本上讲,这适用于您的所有数据库访问,无论数据库您正在与您使用的任何语言交谈。

于 2013-03-22T13:24:40.247 回答
4

您可以使用CultureInfo.InvariantCultureindouble.Parse忽略当前的文化:

double d = double.Parse(s, CultureInfo.InvariantCulture);

演示

output:
0.08
于 2013-03-22T13:26:09.543 回答
1

由于您正在连接字符串以创建 SQL 命令文本,因此您double d可能会转换为字符串为“0,080”,MySql 可能会将其解释为 80。

于 2013-03-22T13:48:54.857 回答