ERRORCODE=-4461

Un ERRORCODE=-4461 est renvoyé lorsqu'une conversion de données non valide dans une connexion JCC de type 4 se produit lorsque la fonction setObject() est utilisée.

Lorsque la fonction Java:setObject pour les types de données caractère et chaîne est utilisée et renvoie une erreur -4461, ce code signifie qu'une conversion de données non valide se produit chaque fois qu'une connexion JCC de type 4 est utilisée. Mais la même fonction aboutit lorsqu'une connexion JCC de type 2 est utilisée.

Cause

Cette erreur est renvoyée pour l'implémentation de type 4 du pilote JDBC , mais pas pour le type 2 car le pilote JDBC de type 4 est un pilote natif Java pur qui respecte strictement les spécifications Java JDBC . Alors que le pilote Type2 JDBC est un pilote basé sur l'interface de ligne de commande qui est moins strict avec les conversions de type de données.

Le code suivant est un petit programme de test permettant de vérifier et de corriger l'erreur:
<test program snip>
String url = "jdbc:db2://aaaaabbbbb.xxx.com:50000/Sample";
Connection con = DriverManager.getConnection(url,"userid","mypwd");
System.out.println("DB Sample Connected");
.
PreparedStatement pstmt =
con.prepareStatement("INSERT INTO table_name VALUES (?)");
// pstmt.setString (2, "P"); ===> SUCCESS
pstmt.setObject (2, new Character('P'), Types.CHAR ); ===> FAILs
pstmt.execute ();
}
catch (Exception ex) {
System.out.println("Exception: " + ex);
ex.printStackTrace();
}
}
L'exécution des programmes précédents génère l'erreur suivante:
Exception: com.ibm.db2.jcc.c.SqlException:
[jcc][1091][10417][3.64.96] Invalid data conversion: Parameter instance
P is invalid for the
requested conversion. ERRORCODE=-4461, SQLSTATE=42815
at com.ibm.db2.jcc.am.bd.a(bd.java:679)
at com.ibm.db2.jcc.am.bd.a(bd.java:60)
at com.ibm.db2.jcc.am.bd.a(bd.java:103)
at com.ibm.db2.jcc.am.ec.a(ec.java:1360)
at com.ibm.db2.jcc.am.ec.a(ec.java:1306)
at com.ibm.db2.jcc.am.jo.a(jo.java:2411)
at com.ibm.db2.jcc.am.jo.setObject(jo.java:2301)
at MAINCLASS.main(settest.java:18)

Lorsque pstmt.setObject est remplacé par pstmt.setString (la ligne mise en commentaire qui précède la ligne défaillante), il insère "P" dans la table.

Réponse

La solution consiste à utiliser la fonction setString à la place de setObject lorsque vous savez que les données d'entrée seront un caractère ou une chaîne.