Name: mc57594 Date: 02/17/97
The ResultSet.wasNull() function returns true after a
getString() or getObject() call on a VARCHAR field that contains
an empty string (i.e. ''). A WHERE clause, however, distinguishes
between the two. Thus, if you execute this statement:
update table set varcharfield='' where primary_key=1
and then execute:
select varcharfield from table where primary_key=1
using ResultSet.getString() followed by ResultSet.wasNull() to
obtain the field value, the ResultSet.wasNull() will return true.
This is not correct, as can be demonstrated by excuting this
statement:
select varcharfield from table where primary_key=1 and
varcharfield is null
This statement will (correctly) return no rows. indicating that
the varcharfield does not contain a SQL NULL, but rather an
empty string.
This was obseved with the JDBC-ODBC bridge against an SQL Anywhere
5.0 database. It's important, because there is a class of
applications that use what you might term "optimistic locking"
for updates: they read a row from the table, allow the user to
modify some fields, then do an 'update where field=oldvalue and
field=oldvalue and ...' to ensure that the row hasn't been
changed by someone else during the interim. This will fail:
the 'update where varcharfield is null and ...' won't succeed
because the varcharfield isn't really null (this is how we
found the problem in the first place).
We have a workaround (check for "varcharfield is null or varcharfield='' ")
but this is pretty ugly...
company - SilverStream Software , email - ###@###.###
======================================================================
|