逗号vs点作为小数分隔符

Pin*_*nx0 0 c# sqlite

我有一个C#应用程序将一些数据写入SQLite数据库,当我尝试将C#double存储到SQLite REAL字段时出现问题.

它用逗号作为小数分隔符将它保存到数据库中(像我国一样,不确定它是否有用).

该表具有以下结构:

CREATE TABLE `valoresStock` (
  `Fecha`   TEXT,
  `IdArticulo`  TEXT,
  `IdColor` INTEGER,
  `KgPorUnidad` REAL,
  `Stock`   REAL,
  `CostePorKg`  REAL,
  `CostePorUnidad`  REAL,
  PRIMARY KEY(Fecha,IdArticulo,IdColor)
);
Run Code Online (Sandbox Code Playgroud)

我在我的应用程序中使用的查询如下:

cmd.CommandText = "INSERT INTO valoresStock (Fecha, IdArticulo, IdColor, KgPorUnidad, Stock, CostePorKg, costePorUnidad) VALUES ('" + DateTime.Today + "','" + referencia.idArticulo + "', '" + referencia.idColor + "', '" + referencia.kilos + "', '" + referencia.stockActual + "', '" + referencia.valorPorKg + "', '" + referencia.valorPorUnidad + "') ";
Run Code Online (Sandbox Code Playgroud)

正如我所说,最后四个字段是double类型.没有错误.

然后数据存储如下:

数据结构

也就是说,当它没有小数部分时使用点,而当它没有时使用逗号.

这个问题是例如当我使用SELECT语句来计算时,例如:

SELECT VS.Fecha, VS.IdArticulo, VS.IdColor, (VS.Stock * (VS.CostePorUnidad + VS.CostePorKg * Vs.KgPorUnidad)) AS Valor FROM valoresStock VS
Run Code Online (Sandbox Code Playgroud)

这给出了以下结果,这是错误的(仅使用点的数字).

逗号错误

因此,如果我手动更改表格中的点的逗号,它可以正常工作.

都有点

但是,如何使我的应用程序这样做,某种文化改变?

或者我可以让SQLite理解或自动转换逗号吗?

为什么SQLite会在以后不理解的情况下接受该号码作为有效号码?

O. *_*per 6

您应该使用参数化查询来插入值.这意味着您应该只在SQL字符串中使用参数占位符,并将实际值添加为查询参数.

这通常是防止SQL注入攻击的好习惯.虽然这些可能是一个较小的问题,但如果您的所有值都是数值(并且可能甚至不直接来自用户输入),则此参数化还用于确保参数值的格式化,就像目标引擎想要/需要它们一样.无需担心正确的小数点分隔符即可识别浮点数,并且无需担心正确的引号和转义即可识别字符串.

因此,您的INSERT陈述应更改如下:

cmd.CommandText = "INSERT INTO valoresStock (Fecha, IdArticulo, IdColor, KgPorUnidad, Stock, CostePorKg, costePorUnidad)"
    + "VALUES (@fecha, @idArticulo, @idColor, @kgPorUnidad, @stock, @costePorKg, @costePorUnidad)";
Run Code Online (Sandbox Code Playgroud)

然后,您可以将参数值添加到命令中,如下所示:

cmd.Parameters.AddWithValue("@fecha", DateTime.Today.ToString(System.Globalization.CultureInfo.InvariantCulture));
cmd.Parameters.AddWithValue("@idArticulo", referencia.idArticulo);
cmd.Parameters.AddWithValue("@idColor", referencia.idColor);
cmd.Parameters.AddWithValue("@kgPorUnidad", referencia.kilos);
cmd.Parameters.AddWithValue("@stock", referencia.stockActual);
cmd.Parameters.AddWithValue("@costePorKg", referencia.valorPorKg);
cmd.Parameters.AddWithValue("@costePorUnidad", referencia.valorPorUnidad);
Run Code Online (Sandbox Code Playgroud)

然后,将自动识别所有浮点值,并将其妥善存储.

需要注意的一点是,我已经显式转换DateTime.Today为字符串有两个原因:

  • DateTime 不是原始类型,所以我不完全确定数据库引擎会对它做什么.
  • 您已将列声明Fecha为具有类型TEXT,因此我假设您希望在数据库中使用日期的文本表示,而不是可以"评估"的任何内容.

为了确保您的程序写入相同的数据,无论在哪台机器上执行,我都使用了实例,它提供了一种独立于当前机器文化设置的"中性"格式.如果你有程序期望这种格式以防你解析日期,你的应用程序编写的数据库文件将始终兼容,即使在具有不同文化设置的机器上使用该应用程序.InvariantCulture CultureInfo