I want to implement a typeHandler for DateTime objects that overrides
the default DateTimeTypeHandler. I've added this text to my
sqlMap.config file:

 <typeHandlers>
  <typeHandler
   type="DateTime"
   callback="Company.Project.DataMapper.MyDateTimeTypeHandler" />
 </typeHandlers>

This is the implementation:

public class MyDateTimeTypeHandler : ITypeHandlerCallback
{
 public object ValueOf(string nullValue)
 {
  // ???
  return Convert.ToDateTime(nullValue);
 }

 public object GetResult(IResultGetter getter)
 {
  if (getter.Value.Equals(System.DBNull.Value))
  {
   return DateTime.MinValue;
  }
  else
  {
   return getter.Value;
  }
 }

 public void SetParameter(IParameterSetter setter, object parameter)
 {
  if (parameter.Equals(DateTime.MinValue))
  {
   setter.Value = System.DBNull.Value;
  }
  else
  {
   setter.Value = parameter;
  }
 }
}

The MyDateTimeTypeHandler class is ignored if I don't specify a dbType
attribute. If I do supply one:

 dbType="System.Data.OleDb.OleDbType"

I get a NullReferenceException on line 200 of TypeHanlderFactory.cs:

public void Register(Type type, string dbType, ITypeHandler handler) 
{
 HybridDictionary map = (HybridDictionary)_typeHandlerMap[type];
 if (map == null) 
 {
  map = new HybridDictionary();
  _typeHandlerMap.Add(type, map);
 }
 if (dbType==null)
 {
  map.Add(NULL, handler); // line 200
 }
 else
 {
  map.Add(dbType, handler);
 }
}

Yes, I've seen the TestCustomTypeHandler test case. That requires me to
specify a typeHandler attribute on the result and parameter nodes:

 <result
  property="Bool2" 
  column="Other_String" 
  typeHandler="OuiNonBool" />

I don't want to do that. I want MyDateTimeTypeHandler to replace the
DateTimeTypeHandler in all cases automatically.

Ideas?

Thanks,
Ron

Reply via email to