C# C“解析字符串”;0“;到整数

C# C“解析字符串”;0“;到整数,c#,C#,我有一台新的笔记本电脑在工作,本周早些时候运行的代码今天不起作用 以前使用过的代码经过简化: while (dr.Read()) { int i = int.Parse(dr.GetString(1)) } 现在,当数据库值为0时,它将失败。有时,但不可靠的是,这会起作用: while (dr.Read()) { int i = Convert.ToInt32(dr["FieldName"])) } 我错过了什么愚蠢的事吗 奇怪的是,ReSharper也有大量奇怪的错误,错误

我有一台新的笔记本电脑在工作,本周早些时候运行的代码今天不起作用

以前使用过的代码经过简化:

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。代码在本周早些时候起作用,数据库没有改变。唯一改变的是我的环境

为了完全简化问题,这行代码抛出一个异常(“输入字符串的格式不正确”):

编辑:感谢大家帮助我解决这个问题!解决方案强制重置我的语言设置。

你确定它是“0”而不是“null”吗?你有什么例外

编辑:

出于好奇,如果int.Parse(“0”)确实有问题,您可以试试int.Parse(“0”,CultureInfo.InvariantCulture)

否则,发布您的查询。有连接吗?

编辑:
@迈克的回答让我觉得这是一种非常奇怪的行为,一个简单的谷歌搜索结果如下:

空字符串也会导致此问题

您可以在解析之前检查dbnull,验证解析后的数据也很好

可以使用默认值和TryParse

int i = -1;
if(!int.TryParse(dr["MyColumn"] as string, out i))
   //Uh Oh!
编辑:

我在@Chris的回答中将此作为注释发布,但是如果sql数据类型为int,那么为什么不在数据生成器上使用该方法,而不是将其作为字符串检索并手动解析出来呢?

我认为,对于从数据库中读取的值,调用Convert.ToInt32通常不是一个好主意,那么该值为null呢,那么无法解析的值呢。这里有异常处理代码吗

  • 确保该值不为null
  • 在调用Int32.Parse之前检查是否可以解析该值。考虑It32。TyPARSE。< /LI>
  • 考虑使用int之类的可空类型?在这种情况下

  • HTH.

    您是否检查空值

    if(!dr.IsNull("FieldName")){
       int i = Convert.ToInt32(dr["FieldName"]))
    }
    
    您应该检查dr[“FieldName”]!=如果TryParse通过了DBNull测试,您应该使用它

    if ( dr["FieldName"] != DBNull.Value )
    {
        int val = 0;
        if ( int.TryParse( dr["FieldName"], out val ) )
        {
            i = val;
        }
        else
        {
            i = 0; // or some default value
        }
    }
    

    我已经看到这个问题出现在.NET双类中,也从字符串“0”进行解析

    这里有一个非常奇怪的部分:你可以通过使用不同的用户帐户来运行程序来解决这个问题,有时如果你在机器上销毁并重新创建当前用户帐户,它会正常运行

    我还没有找到这一点,但你至少可以通过这种方式克服它。

    一种可能:

    基本上,问题在于 下的sPositiveSign值 HKEY_当前用户\控件 面板\国际设置为0, 这意味着正号是“0”。 因此,在解析"正号"时, “0”被切断,其余部分被切断 字符串(“”)的 号码,当然不行。 这也解释了为什么int.Parse(“00”) 没问题。虽然你不能 通过将正号设置为“0” 控制面板,它仍然是可能的 通过注册表执行,导致 问题。不知道计算机是如何工作的 帖子中的用户以 这个错误的设置

    更好的是,这在您的机器上的输出是什么:

    Console.WriteLine(System.Globalization.NumberFormatInfo.GetInstance(null).PositiveSign);
    
    我敢打赌你的打印出一个
    0
    。。。当我的打印出一个
    +
    符号时


    我建议检查您的
    控制面板>区域和语言选项
    设置。。。如果它们看起来正常,请尝试将它们更改为其他语言,而不是返回到您正在使用的任何语言(我假设为英语)。

    这超出了左侧字段,但请检查您的本地化设置。当我将一个网站移动到加拿大服务器时,我遇到了很多“输入字符串格式不正确”的问题。问题出现在DateTime.Parse方法中,通过将区域性设置为“en-US”来解决


    是的,你的情况是不同的-但是,嘿,你永远不知道。

    我肯定它是零而不是零。该列只有0、1和2。只有0失败。System.FormatException:输入字符串的格式不正确。0是否存储为数值?表中的列是什么数据类型。字段是否启用了“NON-NULL”属性,字段的默认值是什么。如果它允许空值,我希望它是空值。如果数据库字段是int,那么您是否考虑过将检索替换为字符串并手动解析以调用GetInt32?您的查询是否包含联接(生成空值)?表列的数据类型是什么?字段是否允许空值?如果您创建的新应用程序的自定义执行代码的唯一行是int.Parse(“0”);它抛出了一个错误,那么我想你可能有一个更大的问题。看看这个。谢谢我要回家了,但今晚我要试试这个。我同意,这是一个“更大”的问题。感谢您尝试错误处理之外的其他方法!!!我知道如何检查空值。:)这不是给了一个八进制0吗?谢谢,我放狗出去后会检查一下,哈哈。@chris-不(用“010”试试,你仍然得到10),但即使如此八进制0仍然是0:)非常感谢!经过你的测试确认后,我换成了法语,又换成了英语,一切都很好!令人印象深刻的心理调试+1我想这方面也有问题,但我不记得它们现在是什么。我一直在和这个摔跤
    Console.WriteLine(System.Globalization.NumberFormatInfo.GetInstance(null).PositiveSign);