C# 输入字符串格式不正确错误

C# 输入字符串格式不正确错误,c#,.net,C#,.net,我不知道为什么会发生这种错误,有人能告诉我吗 long? Max = row["MAX"].ToString() != null || row["MAX"].ToString() != "" ? long.Parse(row["MAX"].ToString()) : (long?)null; 这是: long? val; long parsedVal; if (long.TryParse(row["MAX"].ToString(), out parsedVal)) { val = nu

我不知道为什么会发生这种错误,有人能告诉我吗

 long? Max = row["MAX"].ToString() != null || row["MAX"].ToString() != "" ? long.Parse(row["MAX"].ToString()) : (long?)null;
这是:

long? val;
long parsedVal;
if (long.TryParse(row["MAX"].ToString(), out parsedVal))
{
   val = null;
}
else
{
   val = parsedVal;
}

我相信您会因为[MAX]行而出错。ToString!=无效的 如果行[MAX]为空,则ToString方法将引发异常。将其更改为仅行[MAX]!=如果数据库中的值为null,则使用DBNull.value


注意:您不需要使用long?null,因为类型是long?已支持null。

如果您的目的是检查行[MAX]是否为null,则应将该检查更改为:

row["MAX"] != null
这是因为ToString的返回值从不为null,但如果在null对象上调用它,则它将引发NullReferenceException,然后第[MAX]行。ToString将在null对象上失败

在您的情况下,它不是null,但是空字符串,您可以更改为:

long? Max = (row["MAX"] != null && row["MAX"].ToString() != "") 
    ? long.Parse(row["MAX"].ToString()) : (long?)null;
但正如您所看到的,它不是真正可读的,我会将跳过任何其他验证更改为:

long? Max = null;
if (row["MAX"] != null && row["MAX"].ToString() != "")
    Max = Long.Parse(row["MAX"].ToString());

编辑,如我所指出的,如果您的行对象来自数据库,实际上我们不知道它的类型,所以我们可以猜测并假设它是一种对象字典,您可以使用dBuln.Valk而不是NULL。在这种情况下,行[MAX]!=null为false,但此条件被第二检查行[MAX]捕获。ToString!=。也就是说,如果这是您的情况,并且您确信您的字典不包含任何实际的空值,那么您可以简化它:

if (row["MAX"].ToString() != "")
甚至:

if (row["MAX"] != DBValue.Null)
我想您可能需要添加验证,然后您应该像这样使用TryParse:

// Here you may handle row["MAX"] == null case, if it may happen
string MaxText = row["MAX"].ToString();

long? Max = null;
if (MaxText  != "")
{
    long value;
    if (long.TryParse(MaxText, out value))
    {
        // You may add more validation here, for example
        // to check value's range
        Max = value;
    }
}

您需要检查空字符串和null

在检查null时,不能像调用值为null一样调用ToString,否则会引发NullReferenceException

试试这个:

long? Max = (row["MAX"] != null && !String.IsNullOrEmpty(row["MAX"].ToString()))? long.Parse(row["MAX"].ToString()) : (long?)null;

行[MAX]的值是多少?逐步完成代码,使用调试器!尝试记录行[MAX]。您会发现它不是一个有效的数字。您的行[MAX]不包含长值。因为行[MAX]无法解析为长值?@Sora no,它是一个空字符串,不是空字符串。将检查更改为String.IsNullOrEmptyrow[MAX],因为行[MAX].ToString永远不会为null。如果行[MAX]为null,则在您尝试调用ToString时,它将引发NullReferenceException。如果行[MAX]为null,则ToString方法将引发异常Nope。@DGibbs yes,行。@Adriano您是否尝试过使用空引用调用行上的.ToString?你得到了。至少我刚测试过。@DGibbs你们的行是什么类型的?这里我们看不到,但可以肯定它不是一个值类型,否则不需要解析它,它可以为null,然后抛出。最好的假设是…它是一个通用对象。我使用了一个DataRow,因为op可能也在使用它,这是一个很好的假设。使用列typeof string和int.Meh..它是否编译,不仅仅是因为缺少括号…它现在应该编译,在stackoverflow textarea中写入并没有检查编译和强制转换。无论如何,这些提示是正确的。我认为@Adriano ha mangiato acido stamattina呃…@Downvoter:如果你能改进这个,我会很高兴。因为在编辑之前,它是Dhaval的同一个答案,出于同样的原因,它是错误的。现在它是正确的,即使是第二次检查空后,ToString是多余的,因为它不能,但它已经说了其他地方。这就是说,现在它可以工作了,不是+1,但如果您在5分钟后再次编辑,因为lock@Adriano:是的,感谢您的宝贵意见,已编辑以删除重复支票。非常感谢。