I agree that exception handling/error verbosity could be improved. But don't
get me wrong though -- iBATIS.NET has a very solid 1.0 showing.

Your idea of passing the original exception (instead of just its message) to
the wrapping ConfigurationException would help a lot.

I wouldn't throw NullReferenceExceptions explicitly though - that's intended
to be thrown by the .NET runtime. Instead, throw a ConfigurationException()
with the message. Technically it's not a null reference until you attempt to
use it.

Even better: make use of the provided iBATIS schemas by invoking schema
validation before configuration. The built-in schema validation will give
you the best context for errors in the XML config files and could greatly
simplify the configuration logic.

- Kit 

-----Original Message-----
From: Emmanuele De Andreis [mailto:[EMAIL PROTECTED] 
Sent: Monday, January 17, 2005 12:56 PM
To: ibatis-user-cs@incubator.apache.org
Subject: A debug day with ibatis and netpetshop dao pattern

Hi all ibatis developers and lovers.
I'm spending some time to learn the pattern proposed with netpetshop +
ibatis mapper for developing a simple application of mine as I think
the best way to learn something is to try in real life applications.

This is my experience on debugging mapping files.
As a newbie I do some errors in configuration and I found that is
really difficult to debug as the framework is not so explicit and
talkative about the errors.
I have proposed a couple of fixes that can be discussed.

I'm using build 321

First problem:
The cause was simply "Object null reference"... not so explicit.

Line 75: catch(Exception e)
Line 76: {
Line 77: throw new ConfigurationException(string.Format("DaoManager
could not configure SqlMapDaoSessionHandler.Cause: {0}", e.Message));
Line 78: }
Line 79: }


Source File:
C:\Dev\iBatis\iBatisNet-1.0.1.321\source\IBatisNet.DataAccess\DaoSessionHand
lers\SqlMapDaoSessionHandler.cs
   Line: 77

Proposed fix:

catch(Exception e)
{
throw new ConfigurationException(string.Format("DaoManager could not
configure SqlMapDaoSessionHandler.Cause: {0}", e.Message), e);
}

Now I can jump to the line that raises the exception:

Line 448: XmlDocument config = Resources.GetAsXmlDocument(sqlMapNode);
Line 449:
Line 450: sqlMapName =
config.SelectSingleNode("sqlMap").Attributes["namespace"].Value;
Line 451:
Line 452: #region Load TypeAlias


Source File:
C:\Dev\iBatis\iBatisNet-1.0.1.321\source\IBatisNet.DataMapper\Configuration\
DomSqlMapBuilder.cs
   Line: 450

I changed this way:

XmlDocument config = Resources.GetAsXmlDocument(sqlMapNode);

if (config.SelectSingleNode("sqlMap") == null)
throw new NullReferenceException("Missing 'sqlMap' tag");
if (config.SelectSingleNode("sqlMap").Attributes["namespace"] == null)
throw new NullReferenceException("Missing 'namespace' attribute on
'sqlMap' tag");

sqlMapName =
config.SelectSingleNode("sqlMap").Attributes["namespace"].Value;

so I fixed my map (namespace was missing).

then I found an error on my dao configuration ad I fixed.
Unfortunately seems that after a dao change I need to rebuild or
restert application to make it recognize the changed file.
Same for maps: the only way to reload is restart or rebuild (build is
not enough) the app.

Exception Details: System.InvalidCastException: Specified cast is not valid.

Source Error: 


Line 49: else
Line 50: {
Line 51: return dataReader.GetString(index);
Line 52: }
Line 53: }


Source File:
C:\Dev\iBatis\iBatisNet-1.0.1.321\source\IBatisNet.DataMapper\TypesHandler\S
tringTypeHandler.cs
   Line: 51

Changed:

try
{
if (dataReader.IsDBNull(index) == true)
{
return System.DBNull.Value;
}
else
{
return dataReader.GetString(index);
}
}
catch(InvalidCastException icex)
{
throw new InvalidCastException(string.Format("Invalid cast converting
column '{0}'", mapping.ColumnName), icex);
}


so I was informed that I have missed a field on the output mapping.
I then fixed that and my application now runs.

now the debug is alittle more easy :)

any comment?


Manu


Reply via email to