Re: Stored Procedure error is not catched





Rizwan wrote:

I also test this code with JTDS JDBC Driver and it works. Dont you think this is a bug?

That is a good point. The fundamental issue is whether the driver will buffer up everything the DBMS may be sending from the procedure before the user processes it, in order to find an process the error message that may be somewhere coming. If the procedure does some queries before the failing update, what does the jTDS driver do? In my example it would be:


Statement s = c.createStatement();

          try { s.executeUpdate("drop procedure joeproc"); } catch (Exception ignore){}
          try { s.executeUpdate("drop table joetable"); } catch (Exception ignore){}

          s.executeUpdate("create table joetable (bar varchar(30) not null)");

          s.executeUpdate("create procedure joeproc as "
                     + " begin                                  "
                     + "     insert into joetable values('1')   "
                     + "     select * from sysobjects           "
                     + "     select * from sysobjects           "
                     + "     select * from sysobjects           "
                     + "     select * from sysobjects           "
                     + "     select * from sysobjects           "
                     + "     select * from sysobjects           "
                     + "     select * from sysobjects           "
                     + "     insert into joetable values(NULL)  "
                     + "     insert into joetable values('2')   "
                     + " end                                    ");

          PreparedStatement ps = c.prepareStatement("{ call joeproc() }");
          boolean getResultSet = ps.execute();

If you can try this and let me know?
thanks

"Rizwan" <hussains@xxxxxxxxxxxx> wrote in message news:e0CMXBcqFHA.564@xxxxxxxxxxxxxxxxxxxxxxx


"Joe Weinstein" <joeNOSPAM@xxxxxxx> wrote in message news:430DF786.3010002@xxxxxxxxxx


Rizwan wrote:


I am using MS SQL Server JDBC Driver. I call a stored procedure from my java code. The Stored Procedure does some inserts. One of the insert failed but in my java code the SQLException is not thrown. Can anybody tell me how to fix this bug?

Thanks

Hi. The problem is that the SQLException (or really the error message from the DBMS, that will be turned into a SQLException) is still out on the network for the statement, until it is read by the Statement. This isn't happening immediately because your procedure is doing multiple inserts, and some of the first ones succeed, so the first things on the line are successful update counts. You need to add processing after the execute() to get all the returns, and then you will get your exception. Here is an example which contains the ideal code for processing all the inline returns from any stored procedure. With this, you do get your expected exception.

Joe Weinstein at BEA Systems

     c  = d.connect("jdbc:bea:sqlserver://joe", props);

System.out.println("Driver version is " + c.getMetaData().getDriverVersion() );

DatabaseMetaData dd = c.getMetaData();
System.out.println("Driver version is " + dd.getDriverVersion() );
System.out.println("Database Major version is " + dd.getDatabaseMajorVersion() );
System.out.println("Database Minor version is " + dd.getDatabaseMinorVersion() );


         Statement s = c.createStatement();

try { s.executeUpdate("drop procedure joeproc"); } catch (Exception ignore){}
try { s.executeUpdate("drop table joetable"); } catch (Exception ignore){}


s.executeUpdate("create table joetable (bar varchar(30) not null)");

s.executeUpdate("create procedure joeproc as "
+ " begin "
+ " insert into joetable values('1') "
+ " insert into joetable values(NULL) " // second insert will fail
+ " insert into joetable values('2') "
+ " end ");


PreparedStatement ps = c.prepareStatement("{ call joeproc() }");
boolean getResultSet = ps.execute();
int updateCount = -1;


while (true) { // handle all in-line results from any procedure
if (getResultSet) {
ResultSet r = ps.getResultSet();
while (r.next()) {
// process result set
}
r.close();
} else {
updateCount = ps.getUpdateCount();
if (updateCount != -1) {
;// process update count
}
}
if ((!getResultSet) && (updateCount == -1)) break; // done with loop
getResultSet = ps.getMoreResults();
}


I get:

Driver version is 3.40.57 (012747.007227.008728)
Driver version is 3.40.57 (012747.007227.008728)
Database Major version is 8
Database Minor version is 0
java.sql.SQLException: [BEA][SQLServer JDBC Driver][SQLServer]Cannot insert the value NULL into
column 'bar', table 'CCTEST.dbo.joetable'; column does not allow nulls. INSERT fails.


The exception arives during the getMoreResults() call.


My java code is pretty simple:

Connection conn = null;
CallableStatement stmt = null;
try {
conn = ConnectionHelper.getConnection();
stmt = conn.prepareCall("{call ta_ProcessPayroll()}");
stmt.execute();
} catch (SQLException sqle) {
sqle.printStackTrace();
} finally {
...
}

I tried the same code with Type 1 Driver (JDBC-ODBC Bridge) and error was caught by the SQLException. So I think this is bug with Microsoft SQL Server JDBC Driver. What do you think?







.



Relevant Pages

  • Re: [PATCH 1/5] usb_debug: implement multi urb write
    ... Oliver Neukum wrote: ... That's a clear bug. ... and without exception, even if status indicates an error. ... driver has the same bug, because that is where it was derived from. ...
    (Linux-Kernel)
  • Re: Stored Procedure error is not catched
    ... I also test this code with JTDS JDBC Driver and it works. ... >>> tell me how to fix this bug? ... The problem is that the SQLException (or really the error message ... you do get your expected exception. ...
    (microsoft.public.sqlserver.jdbcdriver)
  • Re: [Oracle] How to check for empty ResultSet?
    ... > such an exception it is something wrong with the way the result set was ... > What driver do you use? ... > you are creating the statement used top open the ResultSet? ... catch (SQLException e) ...
    (comp.lang.java.databases)
  • cvs-src summary for May 31 - June 7
    ... You can get old summaries, and an HTML version of this one, at ... driver for Intel Ethernet cards, then the ndis driver, for emulation of ... Maxime Henrion changed the fxp driver to use the device sysctl tree, ... This bug is covered by `FreeBSD-SA-04:12.jailroute`_, ...
    (freebsd-current)
  • Re: windows error codes
    ... Driver Development Tools: Windows DDK ... This indicates that a kernel-mode program generated an exception which the error handler did not catch. ... For a complete list of exception codes, see the ntstatus.h file located in the inc directory of the Windows DDK. ... This article describes how to troubleshoot a "STOP 0x0000001E KMODE_EXCEPTION_NOT_HANDLED" error message. ...
    (microsoft.public.windowsxp.general)

Loading