Bagikan melalui


Menggunakan jenis data Sql_variant

Unduh driver JDBC

Dimulai dengan versi 6.3.0, driver JDBC mendukung jenis data sql_variant. Sql_variant juga didukung saat menggunakan fitur seperti Table-Valued Parameter dan BulkCopy, dengan beberapa batasan. Tidak semua jenis data dapat disimpan dalam jenis data sql_variant. Untuk daftar jenis data yang didukung dengan sql_variant, lihat sql_variant (Transact-SQL).

Mengisi dan mengambil tabel

Dengan asumsi seseorang memiliki tabel dengan kolom sql_variant sebagai:

CREATE TABLE sampleTable (col1 sql_variant)

Contoh skrip untuk menyisipkan nilai menggunakan pernyataan:

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

Menyisipkan nilai menggunakan pernyataan yang disiapkan:

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

Jika jenis data yang mendasar yang diteruskan diketahui, setter masing-masing dapat digunakan. Misalnya, preparedStatement.setInt() dapat digunakan saat menyisipkan nilai bilangan bulat.

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

Untuk membaca nilai dari tabel, masing-masing getter dapat digunakan. Misalnya, getInt() metode atau getString() dapat digunakan jika nilai yang berasal dari server diketahui:

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

Menggunakan prosedur tersimpan dengan sql_variant

Memiliki prosedur tersimpan seperti:

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

Parameter output harus didaftarkan:

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

Batasan sql_variant

  • Saat menggunakan TVP untuk mengisi tabel dengan nilai yang datetime//smalldatetimedate disimpan dalam sql_variant, panggilangetDate()getDateTime()/getSmallDateTime()/pada ResultSet tidak berfungsi dan melemparkan pengecualian berikut:

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

    Solusi sementara: gunakan getString() atau getObject() sebagai gantinya.

  • Menggunakan TVP untuk mengisi tabel dan mengirim nilai null dalam sql_variant tidak didukung. Mencoba melakukan itu menghasilkan pengecualian:

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

Lihat juga

Memahami jenis data driver JDBC