java - Why I cannot debug a DatabaseMetaData? -
i've strange situation little application in java using jdbc-obdc. i'm inspecting database using databasemetadata class. when execute program, works without anyproblem. when want debug see values inside resulset containing databasemetadata java.sql.sqlexception thrown if put breakpoint within while. here's code:
databasemetadata patrol = con.getmetadata(); resultset answer = patrol.gettables(null, null, null, null); while(answer.next()) { if (answer.wasnull() == false) { tablenamesasone = tablenamesasone + answer.getstring("table_name") + " "; } } answer.close();
why cannot put breakpoint in section of code??
this printstacktrace.
exception in thread "main" java.sql.sqlexception: no data found @ sun.jdbc.odbc.jdbcodbc.standarderror(unknown source) @ sun.jdbc.odbc.jdbcodbc.sqlgetdatastring(unknown source) @ sun.jdbc.odbc.jdbcodbcresultset.getdatastring(unknown source) @ sun.jdbc.odbc.jdbcodbcresultset.getstring(unknown source) @ sun.jdbc.odbc.jdbcodbcresultset.getstring(unknown source) @ snooper.inspect(snooper.java:56) @ snooper.<init>(snooper.java:26) @ snooper.createandshowgui(snooper.java:112) @ snooper.main(snooper.java:125)
line snooper.java:56 in code refers
tablenamesasone = tablenamesasone + answer.getstring("table_name") + " ";
thanks.
i have installed sql server reproduce problem , verify it.
short explanation
you must read values only once , in order appear in select. jdbcodbc sucks. while debugging, you're reading them multiple times.
long explanation
what doing inspecting stateful object in debugger, leads dynamic results.
in case it's sun.jdbc.odbc.jdbcodbcresultset
, executing expression resultset.getstring(...)
multiple times. first time, work (in case breakpoint suspends thread before resultset asked). then, second time (or debugger) inspects value of expression again, getstring()
method called again , method changes internal state of resultset
object.
although method's name suggests it's simple getter, it's not. more that. may retrieve data database, change internal position counters etc. cannot execute getter methods multiple times.
the odbc driver bad thing , of low quality. expect strange behavior , other dragons. can debug information enabling jdbcodbc tracing. done setting logwriter
on drivermanager, before jdbcodbc-bridge activated:
java.sql.drivermanager.setlogwriter(new printwriter(system.out));
then, verbose debugging output of jdbcodbc-driver following. may debug problem have. when debugging, ensure store data retrieved resultset objects in local objects, can inspect them multiple times in debugger.
drivermanager.getconnection("jdbc:odbc:testdbodbc") jdbcodbcdriver class loaded registerdriver: driver[classname=sun.jdbc.odbc.jdbcodbcdriver,sun.jdbc.odbc.jdbcodbcdriver@7b479feb] drivermanager.initialize: jdbc.drivers = null jdbc drivermanager initialized trying driver[classname=sun.jdbc.odbc.jdbcodbcdriver,sun.jdbc.odbc.jdbcodbcdriver@7b479feb] *driver.connect (jdbc:odbc:testdbodbc) jdbc odbc bridge: checking security no securitymanager present, assuming trusted application/applet jdbc odbc bridge 2.0001 current date/time: wed jan 26 00:31:27 cet 2011 loading jdbcodbc library allocating environment handle (sqlallocenv) henv=115724512 allocating connection handle (sqlallocconnect) hdbc=116219184 connecting (sqldriverconnect), hdbc=116219184, szconnstrin=dsn=testdbodbc retcode = 1 warning - generating sqlwarning... sqlwarning: reason([microsoft][odbc sql server driver][sql server]changed database context 'master'.) sqlstate(01000) vendor code(5701) sqlwarning: reason([microsoft][odbc sql server driver][sql server]changed language setting us_english.) sqlstate(01000) vendor code(5703) *connection.getmetadata *databasemetadata.getdrivername connection info string (sqlgetinfo), hdbc=116219184, finfotype=6, len=300 sqlsrv32.dll *databasemetadata.getdriverversion connection info string (sqlgetinfo), hdbc=116219184, finfotype=7, len=300 06.01.7600 *databasemetadata.getdrivername connection info string (sqlgetinfo), hdbc=116219184, finfotype=6, len=300 sqlsrv32.dll driver name: jdbc-odbc bridge (sqlsrv32.dll) *databasemetadata.getdriverversion
p.s. , reproduced exception, including line numbers of sun code jdk 1.6.0_22. can see in first line, printed out on console when inspected getstring()
method.
get string data (sqlgetdata), hstmt=108067024, column=3, maxlen=257 retcode = 100 error - no data found java.sql.sqlexception: no data found @ sun.jdbc.odbc.jdbcodbc.standarderror(jdbcodbc.java:7138) @ sun.jdbc.odbc.jdbcodbc.sqlgetdatastring(jdbcodbc.java:3907) @ sun.jdbc.odbc.jdbcodbcresultset.getdatastring(jdbcodbcresultset.java:5698) @ sun.jdbc.odbc.jdbcodbcresultset.getstring(jdbcodbcresultset.java:354) @ sun.jdbc.odbc.jdbcodbcresultset.getstring(jdbcodbcresultset.java:411) @ sandbox.databasemetadatatest.testdbmetadata(databasemetadatatest.java:27)
Comments
Post a Comment