Dain Sundstrom wrote:
> If you change the jdbc-type (not the sql-type) to VARCHAR, it should
> work for you.  If the parameter type is a Character and the jdbc-type is
> a VARCHAR, the parameter is converted into a string before setting, and
> converted back into a character on get.  This code was added for
> databases that don't support char types such as Oracle. This change does
> not require that the database column type change.

I guess you are talking about the change you made in
JDBCUtil.coerceToSQLType().

> Try it out and if it does work please update the Firebird type in the
> standardjbosscmp-jdbc.xml file.

Letting the database column type be VARCHAR instead would
probably work fine. Unfortunately my DB is pre-defined.

I'm not a JDBC expert, but it looks to me like there
is no (JDBC-standard-) problem with the Firebird driver,
since JDBC has no standard mapping from java.lang.Character
to CHAR. However, there is a mapping from java.lang.String
to CHAR.

My temporary workaround is similar to what you did with
VARCHAR, only I do it each time, like changing
JDBCUtil.coerceToSQLType() to say:
  } else if(value.getClass() == Character.class)
instead of:
  } else if(value.getClass() == Character.class && 
            jdbcType == Types.VARCHAR)
(The only difference being that I do this conversion
in JDBCUtil.setParameter(), just before the call
  pm.setObject(index, value, jdbcType);
With that change all my code runs fine, though I
have not run the complete testsuite.)

It looks to me like the CMP engine would be more
JDBC-conformant, if it always converts a Character
to a String before setting a field.

Is there any case where setting a String wouldn't
work when a Character would?
If not, we might as well always coerce Character
to String.


Best Regards,

Ole Husgaard.

> 
> -dain
> 
> Ole Husgaard wrote:
> > Hi,
> >
> > (Please note that this problem could easily be
> > avoided by using other types. But maybe a small
> > change in the CMP engine and/or the Firebird driver
> > would be better.)
> >
> > I'm using JBoss from CVS about a week old, and
> > firebird-jca-jdbc-driver 1.0-beta-1.
> >
> > In my db, I have a column, defined as
> >   SEX CHAR
> > and I have CMP2.0 accessors for it in my bean
> >   Character getSex();
> >   void setSex(Character sex);
> >
> > My problems start when I create an instance of my bean
> > This provokes an exception in the Firebird driver:
> >  org.firebirdsql.jdbc.TypeConvertionException: Error converting to object.
> >       at org.firebirdsql.jdbc.FBField.setObject(FBField.java:601)
> >       at 
>org.firebirdsql.jdbc.FBPreparedStatement.setObject(FBPreparedStatement.java:212)
> >       at 
>org.firebirdsql.jdbc.FBPreparedStatement.setObject(FBPreparedStatement.java:382)
> >       at org.jboss.ejb.plugins.cmp.jdbc.JDBCUtil.setParameter(JDBCUtil.java:249)
> >       at 
>org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCAbstractCMPFieldBridge.setArgumentParameters(JDBCAbstractCMPFieldBridge.java:283)
> >       at 
>org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCAbstractCMPFieldBridge.setInstanceParameters(JDBCAbstractCMPFieldBridge.java:262)
> >       at 
>org.jboss.ejb.plugins.cmp.jdbc.JDBCCreateEntityCommand.insertEntity(JDBCCreateEntityCommand.java:192)
> >       at 
>org.jboss.ejb.plugins.cmp.jdbc.JDBCCreateEntityCommand.execute(JDBCCreateEntityCommand.java:131)
> >       at 
>org.jboss.ejb.plugins.cmp.jdbc.JDBCStoreManager.createEntity(JDBCStoreManager.java:527)
> >       at 
>org.jboss.ejb.plugins.CMPPersistenceManager.createEntity(CMPPersistenceManager.java:253)
> >       at 
>org.jboss.resource.connectionmanager.CachedConnectionInterceptor.createEntity(CachedConnectionInterceptor.java:270)
> > (Line numbers may be slightly offset by extra debug code I inserted.)
> >
> > At JDBCUtil.java:249, there is a call
> >   pm.setObject(index, value, jdbcType);
> > When this exception occurs, I can se that value is
> > of class java.lang.Character with the value 'M', and
> > that jdbcType is CHAR.
> >
> > I'm not an JDBC expert, but it looks to me like throwing
> > an exception in this case may actually not be a JDBC
> > violation (JDBC has no standard mapping from Character
> > to CHAR).
> >
> > However, it seems logical to call the driver this way, so
> > a change to the FBField class in the Firebird driver to
> > allow this would be nice, and also simple to do.
> >
> > And _if_ the Firebird driver already is JDBC-conformant
> > on this issue, we should probably change the CMP2.0
> > engine so that such a call is not done. That shouldn't
> > be hard to do either, in the JDBCUtil.setParameter()
> > method.
> >
> > But before I do any of the above changes, I would like
> > to hear your comments.
> >
> >
> > Best Regards,
> >
> > Ole Husgaard
> >
> >
> > -------------------------------------------------------
> > This sf.net email is sponsored by:ThinkGeek
> > Oh, it's good to be a geek.
> > http://thinkgeek.com/sf
> > _______________________________________________
> > Jboss-development mailing list
> > [EMAIL PROTECTED]
> > https://lists.sourceforge.net/lists/listinfo/jboss-development
> 
> --
> xxxxxxxxxxxxxxxxxxxxxxxx
> Dain Sundstrom
> Chief Architect JBossCMP
> JBoss Group, LLC
> xxxxxxxxxxxxxxxxxxxxxxxx
> 
> -------------------------------------------------------
> This sf.net email is sponsored by:ThinkGeek
> Oh, it's good to be a geek.
> http://thinkgeek.com/sf
> _______________________________________________
> Jboss-development mailing list
> [EMAIL PROTECTED]
> https://lists.sourceforge.net/lists/listinfo/jboss-development


-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Oh, it's good to be a geek.
http://thinkgeek.com/sf
_______________________________________________
Jboss-development mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/jboss-development

Reply via email to