java variant类型_使用 Sql_variant 数据类型

使用 Sql_variant 数据类型Using Sql_variant data type

08/12/2019

本文内容

从版本 6.3.0 开始,JDBC 驱动程序支持 sql_variant 数据类型。As of version 6.3.0, the JDBC driver supports the sql_variant datatype. 使用表值参数和 BulkCopy 等功能时,也支持 Sql_variant,本页后面部分将提到一些限制。Sql_variant is also supported when using features such as Table-Valued Parameters and BulkCopy with some limitations mentioned later on this page. 并非所有数据类型都可以存储在 sql_variant 数据类型中。Not all data types can be stored in the sql_variant data type. 有关 sql_variant 支持的数据类型列表,请查看 SQL Server Docs。For a list of supported data types with sql_variant, check the SQL Server Docs.

填充和检索表:Populating and retrieving a table:

假设一个表中包含 sql_variant 列,如下所示:Assuming one has a table with a sql_variant column as:

CREATE TABLE sampleTable (col1 sql_variant)

使用语句插入值的示例脚本:A sample script to insert values using statement:

try (Statement stmt = connection.createStatement()){

stmt.execute("insert into sampleTable values (1)");

}

使用预定义语句插入值:Inserting value using prepared statement:

try (PreparedStatement preparedStatement = con.prepareStatement("insert into sampleTable values (?)")) {

preparedStatement.setObject(1, 1);

preparedStatement.execute();

}

如果所传递的数据的基础类型已知,则可以使用相应的资源库。If the underlying type of the data being passed is known, the respective setter can be used. 例如,在插入整数值时,可以使用 preparedStatement.setInt()。For instance, preparedStatement.setInt() can be used when inserting an integer value.

try (PreparedStatement preparedStatement = con.prepareStatement("insert into table values (?)")) {

preparedStatement.setInt (1, 1);

preparedStatement.execute();

}

若要从表中读取值,可以使用相应的 getter。For reading values from the table, the respective getters can be used. 例如,如果来自服务器的值已知,则可以使用 getInt() 或 getString() 方法:For example, getInt() or getString() methods can be used if the values coming from the server are known:

try (SQLServerResultSet resultSet = (SQLServerResultSet) stmt.executeQuery("select * from sampleTable ")) {

resultSet.next();

resultSet.getInt(1); //or rs.getString(1); or rs.getObject(1);

}

使用带有 sql_variant 的存储过程:Using stored procedures with sql_variant:

具有如下所示的存储过程:Having a stored procedure such as:

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

必须注册输出参数:Output parameters must be registered:

try (CallableStatement callableStatement = con.prepareCall(" {call " + inputProc + " (?) }")) {

callableStatement.registerOutParameter(1, microsoft.sql.Types.SQL_VARIANT);

callableStatement.execute();

}

sql_variant 限制:Limitations of sql_variant:

当使用 TVP 用存储在 sql_variant 中的 datetime/smalldatetime/date 值填充表时,在 ResultSet 上调用 getDateTime()/getSmallDateTime()/getDate() 将无效,并且会引发以下异常:When using TVP to populate a table with a datetime/smalldatetime/date value stored in a sql_variant, calling getDateTime()/getSmallDateTime()/getDate() on a ResultSet does not work and throws the following exception:

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

解决方法:改为使用 getString() 或 getObject()。Workaround: use getString() or getObject() instead.

不支持使用 TVP 来填充表并在 sql_variant 中发送 null 值,并且会引发以下异常:Using TVP to populate a table and sending a null value in a sql_variant is not supported and throws an exception:

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

另请参阅See also

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值