[ http://issues.apache.org/jira/browse/DBCP-157?page=all ]

Phil Steitz updated DBCP-157:
-----------------------------

    Bugzilla Id:   (was: 34187)
    Fix Version: 1.3

> [dbcp] allow to register a wrapper extending DelegatingPreparedStatement to 
> enhance setString for compatibility ("schema not null" issue)
> -----------------------------------------------------------------------------------------------------------------------------------------
>
>          Key: DBCP-157
>          URL: http://issues.apache.org/jira/browse/DBCP-157
>      Project: Commons Dbcp
>         Type: Improvement

>  Environment: Operating System: All
> Platform: Other
>     Reporter: Ralf Hauser
>     Priority: Minor
>      Fix For: 1.3

>
> It would be great to be able to register a wrapper enhancing
> org.apache.commons.dbcp.DelegatingPreparedStatement. One purpose of this could
> be to enhance its setString() method to cope with portability issues between
> databases and their jdbc drivers: 
> - mysql considers "" as a non-null string
> - oracle complains that an attempt to insert a null string was made with "".
> A little test case to illustrate will be appended at the end of this 
> description.
> So, to create portability, dbcp users have the advantage that their 
> applications
> don't use the jdbc.jar's setString and getString methods directly anyway.
> Therefore, the proposed wrapper's setString() method should
> 1) detect whether ojdbc_14.jar or alike is used 
> 2) if getting "", change this to a never used string such as
> "eCoUnTeReDsTrInGoFlEnGtHzErO"
> Similarly, the DelegatingResultSet's getString() would have to be wrapped
> accordingly, therefore
> 3) the DelegatingResultSet's wrapper's getString() would do the same in 
> reverse.
> Anyway, even if either oracle or mysql breaks the standard, it is unlikely to
> have them quickly converge to the same behaviour, thus such an enhancement 
> could
> allow programmers to elegantly fix this and gain easy portability not 
> requiring
> them make their applications/db schemes aware of such idiosyncrasies.
> -------------
> In the below code, the mysql jdbc complains at the third attempt to insert 
> while
> recent oracle jdbc already refuses to execute variant 2:
>                 stmt = this.conn.createStatement(
>                         java.sql.ResultSet.TYPE_FORWARD_ONLY,
>                         java.sql.ResultSet.CONCUR_UPDATABLE);
>                 stmt.executeUpdate("DROP TABLE IF EXISTS schmNotNull");
>                 stmt
>                         .executeUpdate("CREATE TABLE schmNotNull ("
>                                 + "msg_id         INT NOT NULL AUTO_INCREMENT
> UNIQUE, "
>                                 + "subject        CHAR(255) NOT NULL, PRIMARY
> KEY (msg_id))");
>                 PreparedStatement insSenderStmt = null;
>                 
>                 //attempt 1
>                 insSenderStmt = this.conn
>                         .prepareStatement("INSERT INTO schmNotNull (  
> subject) "
>                                 + " VALUES (?);");
>                 insSenderStmt.setString(1, "testSubj"); // subject
>                 log.debug("insSenderStmt: "
>                         + ((DelegatingPreparedStatement) insSenderStmt)
>                                 .getDelegate().toString());
>                 int retVal = insSenderStmt.executeUpdate();
>                 log.debug("retVal1: " + retVal);
>                 
>                 //attempt 2
>                 insSenderStmt.setString(1, "");
>                 log.debug("insSenderStmt: "
>                         + ((DelegatingPreparedStatement) insSenderStmt)
>                                 .getDelegate().toString());
>                 retVal = insSenderStmt.executeUpdate();
>                 log.debug("retVal2: " + retVal);
>                 
>                 //attempt 3
>                 insSenderStmt.setString(1, null);
>                 log.debug("insSenderStmt: "
>                         + ((DelegatingPreparedStatement) insSenderStmt)
>                                 .getDelegate().toString());
>                 retVal = insSenderStmt.executeUpdate();
>                 log.debug("retVal3: " + retVal);
> so, the output of mysql looks like:
> <<DEBUG [main] (DBTest.java:590) - insSenderStmt:
> [EMAIL PROTECTED]: INSERT INTO schmNotNull (  subject) 
> VALUES ('testSubj');
> DEBUG [main] (DBTest.java:594) - retVal1: 1
> DEBUG [main] (DBTest.java:596) - insSenderStmt:
> [EMAIL PROTECTED]: INSERT INTO schmNotNull (  subject) 
> VALUES ('');
> DEBUG [main] (DBTest.java:600) - retVal2: 1
> DEBUG [main] (DBTest.java:602) - insSenderStmt:
> [EMAIL PROTECTED]: INSERT INTO schmNotNull (  subject) 
> VALUES (null);
> java.sql.SQLException: Column 'subject' cannot be null
>       at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2847)
>       at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1531)
>       at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1622)
>       at com.mysql.jdbc.Connection.execSQL(Connection.java:2376)
>       at com.mysql.jdbc.Connection.execSQL(Connection.java:2297)
>       at 
> com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1860)
>       at 
> com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1957)
>       at 
> com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1880)
>       at 
> com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1741)
>       at
> org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:101)
>       at 
> com.privasphere.privalope.test.DBTest.testSchemaNotNull(DBTest.java:605)
> ...>>

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to