When the embedded driver raises an SQLException, it is linked to a iapi.error.StandardException whose toString() method adds the SQLState to the error message. An SQLException raised by the client driver is linked to a client.am.SqlException, which does not add the SQLState. Because of this, printStackTrace() gives more information when called on an embedded exception. You have to call getSQLState() on the client exception in order to see the SQLState.
We should change client.am.SqlException's toString() method to work the same way as StandardException.toString().
See also the discussion in