I am using a parameter class to encapsulate the input and output parameters for an Oracle stored procedure that I am calling. When the stored proc returns data for all of the Output parameters all is well, however, when null values are returned in any of the parameters, well, that is when things fall apart. It seems that the problem lies somewhere when converting the System.DBNull value that is coming back from the database. A System.InvalidCastException is thrown for any parameter that contains a null.
I found the following JIRA entry https://issues.apache.org/jira/browse/IBATISNET-247 that seemed to describe the problem that I am encountering. I thought, no problem I will just create a custom type handler to manually convert to the right type. After reading many mail group threads and much experimentation I cannot seem to get that working either. Using the type handler then causes valid return parameters to fail with cast exceptions. *Any guidance or suggestions would be greatly appreciated!* *Here is a snippet from my sqlMap config:* <alias> <typeAlias alias="DbNullHandler" type="Domain.Name.Persistence.Handlers.DbNullTypeHandler,Persistence"/> </alias> <parameterMaps> <parameterMap id="tsrHeader-param" class="Domain.Name.Persistence.ParameterClasses.TsrHeaderParam,Persistence" > <parameter property="p_req_id" direction="Input" /> <parameter property="date_time_group" direction="Output" column="date_time_group" size="100" /> <!--typeHandler="DbNullHandler" type="DateTime" dbType="Date"/>--> <parameter property="message_dest" direction="Output" column="message_dest" size="1000" /> <parameter property="message_origin" direction="Output" column="message_origin" size="1000" /> <parameter property="message_cc" direction="Output" column="message_cc" size="1000" /> <parameter property="return_code" direction="Output" column="return_code" precision="5" scale="0" size="5" type="Decimal"/> </parameterMap> </parameterMaps> <statements> <procedure id="getTsrHeader" parameterMap="tsrHeader-param"> DUNNING_element_tsrHeader </procedure> </statements> *This is the Custom Type Handler snippet:* class DbNullTypeHandler : ITypeHandlerCallback { #region ITypeHandlerCallback Members public void SetParameter(IParameterSetter setter, object parameter) { if (parameter.Equals(DateTime.MinValue)) { setter.Value = System.DBNull.Value; } else { setter.Value = parameter; } } public object GetResult(IResultGetter getter) { if (getter.Value.Equals(System.DBNull.Value)) { return DateTime.MinValue; } else { return getter.Value; } } public object ValueOf(string nullValue) { return nullValue; } public object NullValue { get {return System.DBNull.Value; } } *And this is the parameter class:* public class TsrHeaderParam { private string _p_req_id; public string p_req_id { get { return _p_req_id; } set { _p_req_id = value; } } private DateTime _date_time_group; public DateTime date_time_group { get { return _date_time_group; } set { _date_time_group = value; } } private string _message_origin; public string message_origin { get { return _message_origin; } set { _message_origin = value; } } private string _message_dest; public string message_dest { get { return _message_dest; } set { _message_dest = value; } } private string _message_cc; public string message_cc { get { return _message_cc; } set { _message_cc = value; } } private Decimal _return_code; public Decimal return_code { get { return _return_code; } set { _return_code = value; } } }

