SQLServer类型与Java类型转换问题解决
2014-05-22 22:19
337 查看
ResultSet 接口提供用于从当前行获取列值的获取 方法(getBoolean、getLong 等)。可以使用列的索引编号或列的名称获取值。一般情况下,使用列索引较为高效。列从 1 开始编号。为了获得最大的可移植性,应该按从左到右的顺序读取每行中的结果集列,每列只能读取一次。
对于获取方法,JDBC 驱动程序尝试将底层数据转换为在获取方法中指定的 Java 类型,并返回适当的 Java 值。JDBC 规范有一个表,显示允许的从 SQL 类型到 ResultSet 获取方法所使用的 Java 类型的映射关系。
注意: JDBC 驱动程序目前不支持 SQL Server sqlvariant 数据类型。如果使用查询从包含 sqlvariant 数据类型列的表中检索数据,则会发生异常。
基于 SQL Server 2005 的数据类型,以下图表包含SQLServerResultSet 类的 get<Type> 方法的 JDBC 驱动程序转换图,以及SQLServerCallableStatement 类的
get<Type> 方法支持的转换。
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就没问题,郁闷,到现在还不知道为什么。
对于获取方法,JDBC 驱动程序尝试将底层数据转换为在获取方法中指定的 Java 类型,并返回适当的 Java 值。JDBC 规范有一个表,显示允许的从 SQL 类型到 ResultSet 获取方法所使用的 Java 类型的映射关系。
SQL Server 类型 | JDBC 类型 (java.sql.类型) | Java 语言类型 |
bigint | BIGINT | long |
timestamp binary | BINARY | byte[] |
bit | BIT | Boolean |
charnchar | CHAR | String |
decimal money smallmoney | DECIMAL | java.math.BigDecimal |
float | DOUBLE | double |
int | INTEGER | int |
image | LONGVARBINARY | byte[] |
text ntext | LONGVARCHAR | String |
numeric | NUMERIC | java.math.BigDecimal |
real | REAL | float |
smallint tinyint | SMALLINT | short |
datetime smalldatetime | TIMESTAMP | java.sql.Timestamp |
varbinary | VARBINARY | byte[] |
varchar nvarchar uniqueidentifier | VARCHAR | String |
基于 SQL Server 2005 的数据类型,以下图表包含SQLServerResultSet 类的 get<Type> 方法的 JDBC 驱动程序转换图,以及SQLServerCallableStatement 类的
get<Type> 方法支持的转换。
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就没问题,郁闷,到现在还不知道为什么。
相关文章推荐
- 解决spring使用动态代理类型转换失败的问题--java.lang.ClassCastException: com.sun.proxy.$Proxy$ cannot be cast to ...
- 解决spring使用动态代理类型转换失败的问题--java.lang.ClassCastException: com.sun.proxy.$Proxy$ cannot be cast to ...今天
- 解决Java中Long类型转换成Json时,在Js代码调用时精度丢失的问题
- JSON(3):Java的Date类型转换为符合json语法的字符串遇到的问题及其解决办法
- 解决spring使用动态代理类型转换失败的问题--java.lang.ClassCastException: com.sun.proxy.$Proxy$ cannot be cast to ...
- 将java的集合转换为数据库集合类型 解决weblogic调用存储过程的时候,返回值乱码问题
- java与json互相转换(解决日期问题),js显示json数据时出现日期类型显示[object,object]现象解决!
- 关于java中long类型的数据转换json传到前台时丢失精度问题的解决办法
- 在VS2005/2008中字符串编码问题的解决及字符串和数值类型常用的转换方法
- 解决 C++ Bulider 变量类型转换问题
- 两个有趣的关于java里基本类型转换的问题
- 解决Asp.net 程序在 IIS 5.1 上运行不支持转换Decimal类型小数点的问题
- Oracle自定义函数解决数据类型转换出错的问题
- 类型转换问题(java会把byte,short和char的运算操作转换为int类型即低精度自动向高精度转换)
- 使用反射解决实体类型转换问题
- 解决struts2基础数据类型自动转换,输入字母报错问题!
- 今天遇到关于JAVA INTEGER类型的问题 不过还好 现在解决了,
- 使用Hibernate轻松解决java中date与datetime类型不兼容的问题
- 关于2147217913 从 char 数据类型到 datetime 数据类型的转换导致 datetime 值越界 的问题解决方法
- 基于java时区转换夏令时的问题及解决方法