SQLServer类型与Java类型转换问题解决

  • 格式:doc
  • 大小:79.00 KB
  • 文档页数:3

下载文档原格式

  / 3
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

ResultSet 接口提供用于从当前行获取列值的获取方法(getBoolean、getLong 等)。可以使用列的索引编号或列的名称获取值。一般情况下,使用列索引较为高效。列从 1 开始编号。为了获得最大的可移植性,应该按从左到右的顺序读取每行中的结果集列,每列只能读取一次。

对于获取方法,JDBC 驱动程序尝试将底层数据转换为在获取方法中指定的 Java 类型,并返回适当的 Java 值。JDBC 规范有一个表,显示允许的从 SQL 类型到ResultSet 获取方法所使用的 Java 类型的映射关系。

用查询从包含 sqlvariant 数据类型列的表中检索数据,则会发生异常。

Getter 方法转换

基于 SQL Server 2005 的数据类型,以下图表包含 SQLServerResultSet 类的get方法的 JDBC 驱动程序转换图,以及 SQLServerCallableStatement 类的get方法支持的转换。

JDBC 驱动程序的 getter 方法支持三种基本的转换类别:

∙Non-Lossy (x):在 getter 类型等于或小于基础服务器类型的情况下执行转换。例如,对基础服务器的十进制数列调用getBigDecimal时,

无需进行转换。

∙Converted (y):从数字服务器类型到 Java 语言类型的转换,此时的转换为常规转换,并遵循 Java 语言转换规则。对于这些转换,总是

直接截取有效位数(从不四舍五入),而溢出则按目标类型取模处理,

以较小者为准。例如,对包含“1.9999”的基础十进制数列调用

getInt将返回“1”;如果基础十进制数值为“3000000000”,则 int

值将溢出为“-1294967296”。

Data Dependent (z):从基础字符类型转换到数字类型时,要求字符类型所包含的值可转换成数字类型。不执行其他转换。如果值对于

getter 类型过大,则该值无效。例如,如果对包含“53”的

varchar(50) 列调用getInt,则该值作为 int 返回;但如果基础值

为“xyz”或“3000000000”,则发生错误。

(摘自微软的sqljdbc帮助文档)

1. ResultSet中对于getDouble,getFloat,getInt方法由于返回的是基本类型数据,所以null变为了0(如果值为 SQL NULL ,则返回值为 0 )。这给我们带来了不少麻烦。为了避免这个问题需要借助ResultSet#wasNull()方法

2. ResultSet#getDate。以前没注意过这个家伙返回的类型是java.sql.Date,发现数据库字段类型为datetime时返回来的数据只有年月日,用

ResultSet#getTimestamp就没问题,郁闷,到现在还不知道为什么。

3. 相关资源:

/products/jdbc/overview.html

/zh-cn/data/aa937724(en-us).aspx