我在读取数据库时遇到问题。到目前为止,我确信当我从MySQL读取一些双精度数(它们存储为双精度数而不是string / 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
是我针对当前区域性添加逗号或点的功能。但是问题是当我阅读它时,dataReader [“ COST”]等于0,5
,而不是0.5
编辑2:
如所要求的,这里是Global.ConvertToDouble函数,但是正如我所解释的那样,问题出在该函数之前,因为该函数使用逗号而不是点发送。
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提到这一点)
来自数据库的结果可能包含空值,并且有多种方法可以处理结果中的空值IDataReader
(您可以看到SQL数据读取器-处理空列值或从IDataReader获取值或搜索更广泛的网络的空安全方法)。
例如null
,double
当返回值为null时,您将需要确定是否要使用默认值(对于,则为0 )。
为了帮助您入门,这里提供了一个辅助方法(可以轻松地将其更改为扩展方法,甚至可以将其设为通用方法,以便您可以处理int
s和其他类型)。
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));
3.14
3.14
3,14
3.14
ToString()
然后解析别。
如果要继续使用ToString()-> Parse方法,则必须确保使用调用ToString InvariantCuture
。
consumable.Speed = Global.ConvertToDouble(dataReader["SPEED"]
.ToString(CultureInfo.InvariantCulture));
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句