我收到错误:
输入字符串的格式不正确。
某些父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扩展方法,但是没有用。
答案 0 :(得分:1)
我不喜欢在datareader上调用字符串,而且,它有获取特定类型数据的方法
模式是
if (!dr.IsDBNull(1)) s = dr.GetString(1)
或者对于nullable int:
if (!dr.IsDBNull(1)) i = dr.GetInt32(1)
注意:如果你知道列名并且不知道序数或反之亦然,你可以使用GetOrdinal
和
GetName
方法:
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("")
无论如何都会抛出异常。