On Tuesday, October 19, 2010 3:59 AM, Martin J. Evans wrote: > All drivers I've tried this with report 2 things. The 23000 error > for the insert of a null into a column which does not allow nulls > (the tds_error packet) then a 01000 informational (tds_info) which > states the statement has been terminated. > > However, it does not get around the fact that SQLExecute is > returning SQL_SUCCESS_WITH_INFO with the broken driver. DBD::ODBC > uses the SQLExecute return to determine if the execute was > successful or not (as per the ODBC docs) and not the state of any > error it sees when recovering details of the errors and > informationals. > > I suppose this could be changed but it would need additional logic > everywhere "if (SQL_SUCCEEDED(ret))" is called and some way of > recording the states it has seen since the last ODBC call. I'm not > keen on doing that and not only because the driver in this case is > broken.
I agree; it hardly seems worthwhile. This is what I put in place as a workaround. Does it look reasonable? $retval = $sth->execute(...); $sqlstate = $handle->state; if ( (!defined $retval) || (defined $sqlstate && length $sqlstate && $sqlstate ne '00000' && $sqlstate ne 'S1000' && substr($sqlstate,0,2) ne '01') ) { ...handle error condition -- Eric