Nullable Int输入字符串的格式不正确

时间:2013-12-12 04:32:21

标签: c# asp.net wcf ado.net

我收到错误:

  

输入字符串的格式不正确。

某些父ID可以为空。如果我评论ParentId它是成功的,所以我知道它就是那条线。

var mModel = new MyModel
{
    //non nullable
    Id = int.Parse(dr["Id"].ToString()),  
    //nullable
    ParentId = int.Parse(dr["ParentId"].ToString()),    <--- Throwing the error here
    //non nullable
    ProductService = dr["MyString"].ToString()
};

我已经尝试过Convert.ToInt32()和TryParse()以及事件ToNullableInt扩展方法,但是没有用。

3 个答案:

答案 0 :(得分:1)

我不喜欢在datareader上调用字符串,而且,它有获取特定类型数据的方法

模式是

 if (!dr.IsDBNull(1)) s = dr.GetString(1)

或者对于nullable int:

 if (!dr.IsDBNull(1)) i = dr.GetInt32(1)

注意:如果你知道列名并且不知道序数或反之亦然,你可以使用GetOrdinalGetName方法:

 var i = dr.GetOrdinal("ParentId")

 var name = dr.GetName(1)

答案 1 :(得分:1)

dr["ParentId"]中检查数据库为空,然后转换为int或指定null,如下所示:

ParentId = !dr.IsDBNull(dr.GetOrdinal("ParentId")) 
    ? dr.GetInt32(dr.GetOrdinal("ParentId")) 
    : null;

  

注意:上面的代码假设ParentId变量是一个可以为空的整数(int?Nullable<int>

答案 2 :(得分:0)

你不应该对一个无法正确解析的值使用int.Parse ......它会抛出异常。

如果您确定该值为null或具有有效值,则可以尝试:

ParentId = String.IsNullOrEmpty(Convert.ToString(dr["ParentId"]))
               ? (int?)null
               : int.Parse(dr["ParentId"].ToString());

您可能还想查看Int32.TryParse,它允许您尝试解析并在解析失败时采取一些替代操作:

int id;
if (Int32.TryParse(Convert.ToString(dr["ParentId"]), out id)
    ParentId = id;
else
    ParentId = 0;  // the parse failed

顺便说一句,我喜欢在大多数情况下使用Convert.ToString()而不是.ToString(),因为前者将null转换为空字符串,而后者则抛出异常。只需考虑一下 - 在这种情况下无济于事,因为int.Parse("")无论如何都会抛出异常。