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


Reply via email to