繁体   English   中英

如何从 MySQL 读取双列并将其分配给 C# 双变量?

[英]How do I read a double column from MySQL and assign it to a C# double variable?

我在阅读我的数据库时遇到问题。 到目前为止,我确信当我从 MySQL 读取一些双精度时(它们存储为双精度而不是字符串/ varchar ),它们返回一个点作为小数分隔符。 (10.5)。 但现在我注意到,事实上,他们是在昏迷状态下返回的?

我最近创建了一个新表(一个月前),但刚才我注意到它的双精度值是用逗号,不是点返回的. .

我查了一下,这些表都在 uff8_unicode_ci 中。

我不明白,因为我确定不能在 MySQL 中使用,也在那个链接上检查过。

注意:这可能是因为我使用了几台计算机进行测试,有些是法语的,有些是俄语的?

编辑:

要编辑表格,我执行以下操作:

string request = "UPDATE [vegasteel].consumables SET ID_MACHINE=" + this.idMachine + ",GROUPE="PLASMA",TYPE=\'\',DETAIL=\'14\',SPEED=10.5,TIME=5.5,COST=0.5 WHERE ID=" + this.id;
DataBase.Update(request);

然后阅读它:

if (this.OpenConnection() == true)
{
    IDataReader dataReader = ExecuteReader(query);
    while (dataReader.Read())
    {
        Consumable consumable = new Consumable();
        consumable.ID = Convert.ToInt64(dataReader["ID"].ToString());
        consumable.IdMachine = Convert.ToInt64(dataReader["ID_MACHINE"].ToString());
        consumable.Groupe = dataReader["GROUPE"].ToString();
        consumable.Type = dataReader["TYPE"].ToString();
        consumable.Detail = dataReader["DETAIL"].ToString();
        if(consumable.Groupe=="PLASMA")
        {
            string toto = "";
        }
        consumable.Speed = Global.ConvertToDouble(dataReader["SPEED"].ToString());
        consumable.Time = Global.ConvertToDouble(dataReader["TIME"].ToString());
        consumable.Cost = Global.ConvertToDouble(dataReader["COST"].ToString());
        list.Add(consumable);
    }
    this.CloseConnection();
}

Global.ConvertToDouble是一个 function 我为当前文化添加一个逗号或一个点。 但问题是当我阅读它时, dataReader["COST"] 等于0,5 ,而不是0.5

编辑2:

如所问,这里是 Global.ConvertToDouble function,但正如我所解释的,问题是在 function 之前,因为逗号而不是点发送到 ZC1C425268E68385D1AB5074F141C

public static double ConvertToDouble(this string strToParse, char decimalSymbol = '.')
{
    if (strToParse.Contains('E'))
    {
        strToParse = "0";
    }
    string tmp = Regex.Match(strToParse, @"([-]?[0-9]+)([\s])?([0-9]+)?[." + decimalSymbol + "]?([0-9 ]+)?([0-9]+)?").Value;

    if (tmp.Length > 0 && strToParse.Contains(tmp))
    {
        var currDecSeparator = System.Windows.Forms.Application.CurrentCulture.NumberFormat.NumberDecimalSeparator;

        tmp = tmp.Replace(".", currDecSeparator).Replace(decimalSymbol.ToString(), currDecSeparator);
        return double.Parse(tmp);
    }

    return double.NegativeInfinity;
}

应该将列转换为字符串然后解析它们。 您应该直接阅读它们的类型。

consumable.Speed = (double) dataReader["SPEED"];

或者

consumable.Speed = Convert.ToDouble(dataReader["SPEED"]);

null处理注意事项

(感谢@mjwills 提到这一点)

The results from the db may contain null values and there are many ways of handling nulls in results with IDataReader (you can see SQL Data Reader - handling Null column values or Null safe way to get values from an IDataReader or search the broader web).

例如,当返回值为 null 时,您需要决定是否需要null或默认值( double精度为 0)。

为了让您开始,这里有一个辅助方法(它可以很容易地更改为扩展方法,甚至可以使其成为通用方法,以便您可以处理int和其他类型)。

public static double GetNotNullExample(IDataReader reader, string colName, double valueIfNull)
{
    var colIndex = reader.GetOrdinal(colName);
    if (!reader.IsDBNull(colIndex))
        return reader.GetDouble(colIndex);
    else
        return valueIfNull;
}

发生了什么

重新安装计算机后,文化发生了变化。 以下代码段显示了区域性对ToString方法的影响。

double pie = 3.14; // ;)

CultureInfo.CurrentCulture = new CultureInfo("en-US", false);
Console.WriteLine(pie.ToString());
Console.WriteLine(pie.ToString(CultureInfo.InvariantCulture));

CultureInfo.CurrentCulture = new CultureInfo("ru-RU", false);
Console.WriteLine(pie.ToString());
Console.WriteLine(pie.ToString(CultureInfo.InvariantCulture));

Output

3.14
3.14
3,14
3.14

但我还是想ToString()然后解析

  1. 不。

  2. 如果要继续 ToString()->Parse 方法,则必须确保使用InvariantCuture调用 ToString。

consumable.Speed = Global.ConvertToDouble(dataReader["SPEED"]
                   .ToString(CultureInfo.InvariantCulture));

您需要检查 C# 中的语言环境。 (SQL 标准规定了一个点,并且 MySQL 遵守。)

获得一致 output 的一种简单方法是使用不变区域性。 大多数时候,文化可以作为转换方法的重载。

如果你分享Global.ConvertToDouble方法,我们可以和你一起看看。

编辑

查看您的方法Global.ConvertToDouble ,我建议您删除该代码,因为尚不清楚它应该做什么。 用 0 代替E听起来不合理。 为什么不只是做

Double myVar = 0;
Double.TryParse(dataReader["SPEED"], NumberStyles.Number, CultureInfo.InvariantCulture, out myVar);
return myVar;

编辑 2

要确保的另一件事是,当您将值作为字符串输出时,您应该执行myVar.ToString(CultureInfo.InvariantCulture) ,因此在将值转换为字符串时不会出现逗号.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM