Utilisation du type de données SQL_variant
À compter de la version 6.3.0, le pilote JDBC prend en charge le type de données sql_variant. sql_variant est également pris en charge avec des fonctionnalités comme les paramètres table et la copie en bloc, avec quelques limitations. Tous les types de données ne peuvent pas être stockés dans le type de données sql_variant. Pour connaître la liste des types de données pris en charge avec sql_variant, consultez sql_variant (Transact-SQL).
Remplissage et extraction d’une table
En supposant qu’il existe une table avec une colonne sql_variant comme suit :
CREATE TABLE sampleTable (col1 sql_variant)
Exemple de script pour insérer des valeurs à l’aide d’une instruction :
try (Statement stmt = connection.createStatement()){
stmt.execute("insert into sampleTable values (1)");
}
Insertion d’une valeur à l’aide d’une instruction préparée :
try (PreparedStatement preparedStatement = con.prepareStatement("insert into sampleTable values (?)")) {
preparedStatement.setObject(1, 1);
preparedStatement.execute();
}
Si le type sous-jacent des données passées est connu, vous pouvez utiliser la méthode setter respective. Par exemple, vous pouvez utiliser preparedStatement.setInt()
lors de l’insertion d’une valeur entière.
try (PreparedStatement preparedStatement = con.prepareStatement("insert into table values (?)")) {
preparedStatement.setInt (1, 1);
preparedStatement.execute();
}
Pour la lecture des valeurs à partir de la table, les getters respectifs peuvent être utilisés. Par exemple, les méthodes getInt()
ou getString()
peuvent être utilisées si les valeurs provenant du serveur sont connues :
try (SQLServerResultSet resultSet = (SQLServerResultSet) stmt.executeQuery("select * from sampleTable ")) {
resultSet.next();
resultSet.getInt(1); //or rs.getString(1); or rs.getObject(1);
}
Utilisation de procédures stockées avec sql_variant
Disposer d’une procédure stockée telle que :
String sql = "CREATE PROCEDURE " + inputProc + " @p0 sql_variant OUTPUT AS SELECT TOP 1 @p0=col1 FROM sampleTable ";
Les paramètres de sortie doivent être enregistrés :
try (CallableStatement callableStatement = con.prepareCall(" {call " + inputProc + " (?) }")) {
callableStatement.registerOutParameter(1, microsoft.sql.Types.SQL_VARIANT);
callableStatement.execute();
}
Limitations de sql_variant
Quand vous utilisez des paramètres table pour remplir une table avec une valeur
datetime
/smalldatetime
/date
stockée dans un sql_variant, l’appel degetDateTime()
/getSmallDateTime()
/getDate()
sur un ResultSet ne fonctionne pas et lève l’exception suivante :Java.lang.String cannot be cast to java.sql.Timestamp
Solution de contournement : utilisez
getString()
ougetObject()
à la place.Il n’est pas possible d’utiliser des paramètres table pour remplir une table et envoyer une valeur Null dans un sql_variant, car cela produit une exception :
Inserting null value with column type sql_variant in TVP is not supported.