You are viewing a plain text version of this content. The canonical link for it is here.
Posted to ddlutils-dev@db.apache.org by Peter Doyle <de...@rdmf.net> on 2007/02/14 22:58:16 UTC

error handling in ModelBasedResultSetIterator

I would like to make a request or offer to contribute something with 
regards error handling? Specifically, with regards to data extraction 
using the  org.apache.ddlutils.platform.ModelBasedResultSetIterator 
class. As is, If this Iterators encounters an error when setting a 
Dynabean property it throws a generic 
 DatabaseOperationException("Exception while reading the row from the 
resultset"). It occurs, in my case, when encountering an  allowable 
(under mysql) but perhaps a bit unusual date value of "0000-00-00".  The 
existing source code in question looks like this:

 45 /**
 46  * This is an iterator that is specifically targeted at traversing result sets.
 47  * If the query is against a known table, then {@link org.apache.ddlutils.dynabean.SqlDynaBean} instances
 48  * are created from the rows, otherwise normal {@link org.apache.commons.beanutils.DynaBean} instances
 49  * are created.
 50  * 
 51  * @version $Revision: 289996 $
 52  */

...

218     /**
219      * {@inheritDoc}
220      */
221     public Object next() throws DatabaseOperationException
222     {
223         advanceIfNecessary();
224         if (_isAtEnd)
225         {
226             throw new NoSuchElementException("No more elements in the resultset");
227         }
228         else
229         {
230             try
231             {
232                 DynaBean bean  = _dynaClass.newInstance();
233                 Table    table = null;
234 
235                 if (bean instanceof SqlDynaBean)
236                 {
237                     SqlDynaClass dynaClass = (SqlDynaClass)((SqlDynaBean)bean).getDynaClass();
238 
239                     table = dynaClass.getTable();
240                 }
241 
242                 for (Iterator it = _columnsToProperties.entrySet().iterator(); it.hasNext();)
243                 {
244                     Map.Entry entry      = (Map.Entry)it.next();
245                     String    columnName = (String)entry.getKey();
246                     String    propName   = (String)entry.getValue();
247                     Table     curTable   = table;
248 
249                     if (curTable == null)
250                     {
251                         curTable = (Table)_preparedQueryHints.get(_caseSensitive ? columnName : columnName.toLowerCase());
252                     }
253                     Object value = _platform.getObjectFromResultSet(_resultSet, columnName, curTable);
254 
255                     bean.set(propName, value);
256                 }
257                 _needsAdvancing = true;
258                 return bean;
259             }
260             catch (Exception ex)
261             {
262                 cleanUp();
263                 throw new DatabaseOperationException("Exception while reading the row from the resultset", ex);
264             }
265         }
266     }


I am suggesting at least more lax error handling around the value 
setting code (lines 253 - 255) as I use below (using some logging api 
wrapped with commons-logging) to just log the actual error message 
encountered ("[ERROR] ModelBasedResultSetIterator - Value '0000-00-00' 
can not be represented as java.sql.Date") and proceed with the 
extraction rather than just fail. An even better solution might be to 
declare a level for error handling (fail | warn | ignore perhaps) that 
could be specified as ant task attribute so the could would know how to 
handle the errors encountered more precisely.

258                     Object value=null;
259                     
260                     try {
261                         value = _platform.getObjectFromResultSet(_resultSet, columnName, curTable);
262                         bean.set(propName, value);
263                     } catch (SQLException ex) {
264                         log.error(ex.getMessage());
265                     }




Re: error handling in ModelBasedResultSetIterator

Posted by Thomas Dudziak <to...@gmail.com>.
On 2/14/07, Peter Doyle <de...@rdmf.net> wrote:

> I would like to make a request or offer to contribute something with
> regards error handling? Specifically, with regards to data extraction
> using the  org.apache.ddlutils.platform.ModelBasedResultSetIterator
> class. As is, If this Iterators encounters an error when setting a
> Dynabean property it throws a generic
>  DatabaseOperationException("Exception while reading the row from the
> resultset"). It occurs, in my case, when encountering an  allowable
> (under mysql) but perhaps a bit unusual date value of "0000-00-00".  The
> existing source code in question looks like this:

<snip>

> I am suggesting at least more lax error handling around the value
> setting code (lines 253 - 255) as I use below (using some logging api
> wrapped with commons-logging) to just log the actual error message
> encountered ("[ERROR] ModelBasedResultSetIterator - Value '0000-00-00'
> can not be represented as java.sql.Date") and proceed with the
> extraction rather than just fail. An even better solution might be to
> declare a level for error handling (fail | warn | ignore perhaps) that
> could be specified as ant task attribute so the could would know how to
> handle the errors encountered more precisely.

The problem is that the MySql JDBC driver tries to map an illegal
value to a java.sql.Date. Now the question is, how should this value
be represented ? As null or as some Date ?

The error handling is a different thing. I'd like to suggest that you
create a JIRA issue for adding a failOnError=true/false mode for
reading data from a database.

Tom