为了简化 Java 编程语言数据类型到 SQL Server 数据类型的转换,Microsoft SQL Server 2005 JDBC Driver 根据 JDBC 规范的要求提供了数据类型转换。为了提高灵活性,所有类型都可以与 Object、String 和 byte[] 数据类型相互转换。
Getter 方法转换
基于 SQL Server 2005 的数据类型,以下图表包含 SQLServerResultSet 类的 get<Type> 方法的 JDBC 驱动程序转换图,以及 SQLServerCallableStatement 类的 get<Type> 方法支持的转换。

JDBC 驱动程序的 getter 方法支持三种基本的转换类别:
-
非丢失 (x):发生转换时,getter 类型与基础服务器类型相同或前者小于后者。例如,对基础服务器十进制数列调用 getBigDecimal 时,无需进行转换。
-
已转换 (y):从数值服务器类型转换为 Java 语言类型,其中转换是常规的并遵循 Java 语言转换规则。对于这些转换,总是直接截取有效位数(从不四舍五入),而溢出则按目标类型取模处理,以较小者为准。例如,对于包含“1.9999”的基础 decimal 列调用 getInt 时将返回“1”,或者,如果基础 decimal 值为“3000000000”,则 int 值溢出为“-1294967296”。
-
依赖于数据 (z):如果从基础字符类型转换到数值类型,则要求字符类型包含可转换为该类型的值。不执行其他转换。如果值对于 getter 类型过大,则该值无效。例如,如果对包含“53”的 varchar(50) 列调用 getInt,则值将作为 int 返回;如果基础值为“xyz”或“3000000000”,则将引发错误。
Setter 方法转换
对于传递给 SQLServerResultSet 类的 update<Type> 方法,以及 SQLServerPreparedStatement 类的 setObject<Type> 方法的 Java 类型的数据,可应用下列转换。

没有指定目标类型的 setObject 方法将使用默认映射。带类型的参数 setter(SQLServerPreparedStatement 类的 set<Type> 方法,以及 SQLServerCallableStatement 类的 set<Type> 方法)也使用默认的 Java 到 JDBC 的类型映射,并且会将该类型传递给服务器。服务器将尝试所有转换,并在失败时返回错误。
对于 String 数据类型,如果值超过了 VARCHAR 的长度,则它将映射为 LONGVARCHAR。这同样适用于 byte[]。比 VARBINARY 长的值将成为 LONGVARBINARY。
JDBC 驱动程序的 setter 方法支持两种基本的转换类别:
-
非丢失 (x):发生数值转换时,setter 类型与基础服务器类型相同或前者小于后者。例如,当对基础服务器 decimal 列调用 setBigDecimal 时,不需要进行转换。对于数值转换为字符的情形,Java numeric 数据类型转换为 String。例如,使用值“53”对 varchar(50) 列调用 setDouble 时将在该目标列中生成字符值“53”。
-
已转换 (y):从 Java numeric 类型转换为更小的基础服务器 numeric 类型。该转换为常规转换,并且遵循 SQL Server 转换约定。总是直接截取有效位数(从不四舍五入),而溢出将引发不支持转换的错误。例如,通过值“1.9999”对基础整数列使用 updateDecimal 时,将在目标列中生成“1”;但如果传递的值为“3000000000”,驱动程序将引发错误。
SQL Server 执行大部分设置和更新转换,并且在出现问题时将错误传递回 JDBC 驱动程序。客户端转换是例外情况,仅在值为 date、time、timestamp、Boolean 和 String 的情况下才执行。
如果调用 updateObject 和 setObject,则这些方法将查找传递的对象类型,然后调用相应类型的 setter 方法。