Uso del tipo di dati Sql_variant
A partire dalla versione 6.3.0, il driver JDBC supporta il tipo di dati sql_variant. Il tipo di dati sql_variant è supportato anche quando si usano funzionalità come i parametri con valori di tabella e la copia bulk, con alcune limitazioni. Non tutti i tipi di dati possono essere archiviati nel tipo di dati sql_variant. Per un elenco dei tipi di dati supportati con sql_variant, vedere sql_variant (Transact-SQL).
Popolamento e recupero di una tabella
Si supponga di avere una tabella con una colonna sql_variant come riportato di seguito:
CREATE TABLE sampleTable (col1 sql_variant)
Script di esempio per inserire i valori usando un'istruzione:
try (Statement stmt = connection.createStatement()){
stmt.execute("insert into sampleTable values (1)");
}
Inserimento del valore usando un'istruzione preparata:
try (PreparedStatement preparedStatement = con.prepareStatement("insert into sampleTable values (?)")) {
preparedStatement.setObject(1, 1);
preparedStatement.execute();
}
Se il tipo sottostante dei dati passati è noto, è possibile usare il rispettivo setter. È ad esempio possibile usare preparedStatement.setInt()
quando si inserisce un valore intero.
try (PreparedStatement preparedStatement = con.prepareStatement("insert into table values (?)")) {
preparedStatement.setInt (1, 1);
preparedStatement.execute();
}
Per leggere i valori della tabella, è possibile usare i rispettivi getter. È ad esempio possibile usare i metodi getInt()
o getString()
se i valori provenienti dal server sono noti:
try (SQLServerResultSet resultSet = (SQLServerResultSet) stmt.executeQuery("select * from sampleTable ")) {
resultSet.next();
resultSet.getInt(1); //or rs.getString(1); or rs.getObject(1);
}
Uso di stored procedure con sql_variant
Si supponga di avere una stored procedure come riportato di seguito:
String sql = "CREATE PROCEDURE " + inputProc + " @p0 sql_variant OUTPUT AS SELECT TOP 1 @p0=col1 FROM sampleTable ";
I parametri di output devono essere registrati:
try (CallableStatement callableStatement = con.prepareCall(" {call " + inputProc + " (?) }")) {
callableStatement.registerOutParameter(1, microsoft.sql.Types.SQL_VARIANT);
callableStatement.execute();
}
Limitazioni di sql_variant
Quando si usa un parametro con valori di tabella per popolare una tabella con un valore
datetime
/smalldatetime
/date
archiviato in un tipo sql_variant, la chiamata digetDateTime()
/getSmallDateTime()
/getDate()
in ResultSet non funziona e genera l'eccezione seguente:Java.lang.String cannot be cast to java.sql.Timestamp
Soluzione alternativa: usare invece
getString()
ogetObject()
.L'uso di un parametro con valori di tabella per popolare una tabella e inviare un valore null in un tipo sql_variant non è supportato. Se si prova a eseguire questa operazione, viene generata un'eccezione:
Inserting null value with column type sql_variant in TVP is not supported.