簡體   English   中英

將Java Double Infinity和NaN值存儲到MS SQL 2008數據庫

[英]Storing Java Double Infinity and NaN values to MS SQL 2008 database

在我們的業務邏輯中,我們必須處理正負Double.Infinity值以及Double.NaN值。

我們必須將這些值存儲到Microsot SQL Server 2008數據庫中。 問題是Microsot SQL Server不支持infinity或nan值。 SQL Server 2005的問題描述 ,也適用於MS SQL Server 2008)。

我們使用Hibernate 3.6.7作為我們的JPA實現和Microsoft的sqljdbc4驅動程序版本4.0.2206.100。

我們試圖通過將JPA實體的列定義設置為VARCHAR來解決此問題

@Column(columnDefinition = "VARCHAR(40)")
private Double foo;

即使列定義在數據庫中正確更改為VARCHAR,這似乎也沒有任何影響。 看起來無限值是在JDBC驅動程序的驗證中捕獲的,因為我們在嘗試INSERT Double.Infinity值時得到以下stacktrace:

Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: The incoming tabular data  stream (TDS) remote procedure call (RPC) protocol stream is incorrect. Parameter 6 (""): The supplied value is not a valid instance of data type float. Check the source data for invalid values. An example of an invalid value is data of numeric type with scale greater than precision.
    at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:216)
    at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1515)
    at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:404)
    at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:350)
    at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:5696)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1715)
    at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:180)
    at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:155)
    at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeUpdate(SQLServerPreparedStatement.java:314)
    at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
    at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
    at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:94)
    at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:57)
    ... 79 more

如何解決這個問題的任何想法都是受歡迎的。

以下是此問題的簡單解決方法:對字段類型使用String ,並在getter和setter中執行轉換。 這樣您就不必更改業務邏輯,並且可以很好地封裝實際的轉換邏輯。

// Column definition is not a necessity here
@Column(columnDefinition = "VARCHAR(40)")
private String foo;

public Double getFoo() {
    return this.foo != null ? Double.valueOf(this.foo) : null;
}

public void setFoo(Double d) {
    this.foo = d != null ? d.toString() : null;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM