我有一台新的笔记本电脑在工作,本周早些时候工作的代码今天不起作用。
以前工作的代码是简化的:
while (dr.Read())
{
int i = int.Parse(dr.GetString(1))
}
现在它在数据库值为0时失败。有时,但不可靠,这将起作用:
while (dr.Read())
{
int i = Convert.ToInt32(dr["FieldName"]))
}
我错过了一些愚蠢的东西吗?
奇怪的是,ReSharper也遇到了大量奇怪的错误,我使用上面的代码得到了相同的错误消息:“输入字符串的格式不正确。” (在我加载项目之前开始。)
有什么想法吗?任何有SP问题的人?当我拿到机器时,我确实试图确保所有的SP都是最新的。
编辑:我了解如何使用Try.Parse和错误处理。这里的代码是简化的。我正在从数据库表中读取测试用例。此列仅包含0,1和2值。我已经证实了这一点。我打破了这一点,将数据库字段放入字符串变量s然后尝试int.Parse(s)。该代码本周早些时候工作,数据库没有改变。唯一改变的是我的环境。
为了完全简化问题,这行代码抛出一个异常(“输入字符串的格式不正确”):
int.Parse("0");
编辑:感谢大家帮我解决这个问题!解决方案是强制重置我的语言设置。
答案 0 :(得分:21)
可能的explanation:
基本上,问题是 sPositiveSign值下 HKEY_CURRENT_USER \控制 Panel \ International设置为0, 这意味着正号为'0'。 因此,在解析“正号”时 0“正在切断然后其余部分 字符串(“”)被解析为a 数字,当然不起作用。 这也解释了为什么int.Parse(“00”) 不是问题。虽然你做不到 将正号设置为“0” 控制面板,它仍然是可能的 通过注册表来做,导致 问题。不知道电脑怎么样 帖子中的用户最终得到了 这个错误的设置......
更好的是,你机器上的输出是什么:
Console.WriteLine(System.Globalization.NumberFormatInfo.GetInstance(null).PositiveSign);
当我打印出0
标志时,我愿意打赌你打印+
...
我建议检查您的Control Panel > Regional and Language Options
设置......如果它们显得正常,请尝试将其更改为其他内容而不是使用您正在使用的任何语言(我假设为英语)。
答案 1 :(得分:3)
我认为调用Convert.ToInt32来读取数据库中的值通常不是一个好主意,该值为null,该值无法解析。你在这里有任何异常处理代码。
HTH。
答案 2 :(得分:2)
你确定它是“0”而不是“空”吗?您有什么例外?
编辑:
出于好奇,如果它真的出现在int.Parse(“0”)上,你可以尝试int.Parse(“0”,CultureInfo.InvariantCulture);?
否则,发布您的查询。任何加入?
答案 3 :(得分:2)
编辑:
@ Mike的回复让我觉得这是非常奇怪的行为,一个简单的谷歌搜索产生了这个结果:int.Parse weird behavior
空字符串也会导致此问题。
您可以在解析之前检查dbnull,也可以验证已解析的数据。
您可以使用默认值和TryParse ..
int i = -1;
if(!int.TryParse(dr["MyColumn"] as string, out i))
//Uh Oh!
编辑:
我在@Chris的回答中将其作为注释发布,但是如果sql数据类型是int,那么为什么不在DataReater上使用GetInt32方法而不是将其作为字符串检索并手动解析出来?
答案 4 :(得分:1)
你应该检查dr [“FieldName”]!= DBNull.Value,如果它通过了DBNull测试你应该使用TryParse ......
if ( dr["FieldName"] != DBNull.Value )
{
int val = 0;
if ( int.TryParse( dr["FieldName"], out val ) )
{
i = val;
}
else
{
i = 0; // or some default value
}
}
答案 5 :(得分:1)
我已经看到这个问题出现在.NET Double类中,也从字符串“0”解析。
这是一个非常古怪的部分:您可以通过使用不同的用户帐户来运行该程序,有时如果您在计算机上销毁并重新创建当前用户帐户,它运行良好。
我还没有追踪到这一点,但至少你可能会以这种方式过去。
答案 6 :(得分:1)
这是离开左侧的字段,但请检查您的本地化设置。当我将网站移动到加拿大服务器时,我有一些“输入字符串格式不正确”。问题出在DateTime.Parse方法中,并通过将文化设置为“en-US”来修复。
是的,你的情况有所不同 - 但是,嘿,你永远不会知道。
答案 7 :(得分:0)
if(!dr.IsNull("FieldName")){
int i = Convert.ToInt32(dr["FieldName"]))
}