Używanie typu danych Sql_variant

pobierz sterownik JDBC

Począwszy od wersji 6.3.0, sterownik JDBC obsługuje typ danych sql_variant. Sql_variant jest również obsługiwany w przypadku korzystania z funkcji takich jak parametry tabelaryczne i narzędzie BulkCopy, z pewnymi ograniczeniami. Nie wszystkie typy danych mogą być przechowywane w typie danych sql_variant. Aby uzyskać listę obsługiwanych typów danych z sql_variant, zobacz sql_variant (Transact-SQL).

Wypełnianie i pobieranie tabeli

Zakładając, że tabela ma kolumnę sql_variant:

CREATE TABLE sampleTable (col1 sql_variant)

Przykładowy skrypt do wstawiania wartości przy użyciu instrukcji:

try (Statement stmt = connection.createStatement()){
    stmt.execute("insert into sampleTable values (1)");
}

Wstawianie wartości przy użyciu przygotowanego zapytania:

try (PreparedStatement preparedStatement = con.prepareStatement("insert into sampleTable values (?)")) {
    preparedStatement.setObject(1, 1);
    preparedStatement.execute();
}

Jeśli znany jest bazowy typ przekazywanych danych, można użyć odpowiedniego settera. Na przykład preparedStatement.setInt() można użyć podczas wstawiania wartości całkowitej.

try (PreparedStatement preparedStatement = con.prepareStatement("insert into table values (?)")) {
    preparedStatement.setInt (1, 1);
    preparedStatement.execute();
}

Do odczytywania wartości z tabeli można użyć odpowiednich metod pobierania. Na przykład można użyć metod getInt() lub getString(), jeśli znane są wartości pochodzące z serwera:

try (SQLServerResultSet resultSet = (SQLServerResultSet) stmt.executeQuery("select * from sampleTable ")) {
    resultSet.next();
    resultSet.getInt(1); //or rs.getString(1); or rs.getObject(1);
}

Używanie procedur składowanych z sql_variant

Posiadanie procedury składowanej, takiej jak:

String sql = "CREATE PROCEDURE " + inputProc + " @p0 sql_variant OUTPUT AS SELECT TOP 1 @p0=col1 FROM sampleTable ";

Parametry wyjściowe muszą być zarejestrowane:

try (CallableStatement callableStatement = con.prepareCall(" {call " + inputProc + " (?) }")) {
    callableStatement.registerOutParameter(1, microsoft.sql.Types.SQL_VARIANT);
    callableStatement.execute();
}

Ograniczenia sql_variant

  • W przypadku wypełniania tabeli datetime/smalldatetime/date za pomocą TVP wartością przechowywaną w sql_variant, wywołanie getDateTime()/getSmallDateTime()/getDate() na ResultSet nie działa i zgłasza następujący wyjątek:

    Java.lang.String cannot be cast to java.sql.Timestamp

    Obejście: użyj polecenia getString() lub getObject() zamiast tego.

  • Używanie TVP do wypełniania tabeli i wysyłania wartości null w "sql_variant" nie jest obsługiwane. Próba wykonania tej czynności powoduje wyjątek:

    Inserting null value with column type sql_variant in TVP is not supported.