@@ -30,7 +30,7 @@ public class MSSQLException extends DatabaseException {
30
30
private List <MSSQLException > additional ;
31
31
32
32
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 ) );
34
34
this .state = state ;
35
35
this .severity = severity ;
36
36
this .errorMessage = errorMessage ;
@@ -39,6 +39,41 @@ public MSSQLException(int number, byte state, byte severity, String errorMessage
39
39
this .lineNumber = lineNumber ;
40
40
}
41
41
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
+
42
77
public void add (MSSQLException e ) {
43
78
if (additional == null ) {
44
79
additional = new ArrayList <>(3 );
0 commit comments