@@ -30,7 +30,7 @@ public class MSSQLException extends DatabaseException {
3030 private List <MSSQLException > additional ;
3131
3232 public MSSQLException (int number , byte state , byte severity , String errorMessage , String serverName , String procedureName , int lineNumber ) {
33- super (formatMessage (number , state , severity , errorMessage , serverName , procedureName , lineNumber ), number , null );
33+ super (formatMessage (number , state , severity , errorMessage , serverName , procedureName , lineNumber ), number , generateStateCode ( number , state ) );
3434 this .state = state ;
3535 this .severity = severity ;
3636 this .errorMessage = errorMessage ;
@@ -39,6 +39,41 @@ public MSSQLException(int number, byte state, byte severity, String errorMessage
3939 this .lineNumber = lineNumber ;
4040 }
4141
42+
43+ /**
44+ * Generates the JDBC state code based on the error number returned from the database.
45+ *
46+ * This method is derived from the method with the same name in the JDBC driver
47+ * in com.microsoft.sqlserver.jdbc.SQLServerException
48+ *
49+ * @param errNum
50+ * the vendor error number
51+ * @param databaseState
52+ * the database state
53+ * @return the SQL state code (XOPEN or SQL:2003 conventions)
54+ */
55+ static String generateStateCode (int errNum , int databaseState ) {
56+ switch (errNum ) {
57+ // case 18456: return EXCEPTION_XOPEN_CONNECTION_CANT_ESTABLISH; //username password wrong at login
58+ case 8152 :
59+ return "22001" ; // String data right truncation
60+ case 515 : // 2.2705
61+ case 547 :
62+ case 2601 :
63+ case 2627 :
64+ return "23000" ; // Integrity constraint violation
65+ case 2714 :
66+ return "S0001" ; // table already exists
67+ case 208 :
68+ return "S0002" ; // table not found
69+ case 1205 :
70+ return "40001" ; // deadlock detected
71+ default : {
72+ return "S" + String .format ( "%4s" , databaseState ).replaceAll ( " " , "0" );
73+ }
74+ }
75+ }
76+
4277 public void add (MSSQLException e ) {
4378 if (additional == null ) {
4479 additional = new ArrayList <>(3 );
0 commit comments