在NHibernate中应用Mysql正为空日期的问题困扰
Unable to convert MySQL date/time value to System.DateTime
相信这个问题很多人都会看到的。在mySql数据库中这类日期都是“0000-0-0”。设置allow zero datetime=true,这类日期在connector-net-5.1.4返回一个MySqlDateTime类型,值自然是0000-0-0,Nullables.NHibernate得到这个值时尝试转换为日期
public override object Get(IDataReader rs, int index)
{
return new NullableDateTime(Convert.ToDateTime(rs[index]));//rs[index]是一个MySqlDateTime的object
}
这时会抛出上面的错误。
如果在连接字符串中不设置“allow zero datetime=true”,那在判断是否是DBNull时就抛出上面的错误
int index = rs.GetOrdinal(name);
![](/Images/OutliningIndicators/None.gif)
if (rs.IsDBNull(index))
{
if (IsDebugEnabled)
{
Log.Debug("returning null as column: " + name);
}
// TODO: add a method to NullableType.GetNullValue - if we want to
// use "MAGIC" numbers to indicate null values![](https://www.cnblogs.com/Images/dot.gif)
return null;
}
else
{
object val = null;
try
{
val = Get(rs, index);
}
.
}
以为下载了connector-net的源代码就能找到解决的方法,没想到工程有一个项目打不开,编译的DLL又无法加到GAC去,只好又回头去改Nullables.NHibernate.NullableDateTimeType
public override object Get(IDataReader rs, int index)
{
//return new NullableDateTime(Convert.ToDateTime(rs[index]));
//kevin Modify
object obj = rs[index];
string strName = obj.GetType().ToString();
if (strName == "MySql.Data.Types.MySqlDateTime")
{
string strVal = obj.ToString();
if (strVal.StartsWith("0000-0-0"))
return null;
else
return new NullableDateTime(Convert.ToDateTime(strVal));
}
else
{
return new NullableDateTime(Convert.ToDateTime(rs[index]));
}
}
相信这个问题很多人都会看到的。在mySql数据库中这类日期都是“0000-0-0”。设置allow zero datetime=true,这类日期在connector-net-5.1.4返回一个MySqlDateTime类型,值自然是0000-0-0,Nullables.NHibernate得到这个值时尝试转换为日期
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
如果在连接字符串中不设置“allow zero datetime=true”,那在判断是否是DBNull时就抛出上面的错误
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](https://www.cnblogs.com/Images/dot.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
以为下载了connector-net的源代码就能找到解决的方法,没想到工程有一个项目打不开,编译的DLL又无法加到GAC去,只好又回头去改Nullables.NHibernate.NullableDateTimeType
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/None.gif)