2012-04-10 8 views
3

SQL Server用のMS JDBCドライバを使用していて、小数点(18,5)の列に値を挿入しようとしています。SQL Serverの10進数の列に挿入する方法は?

com.microsoft.sqlserver.jdbc:、私はこのエラーを取得する)(実行するコールで

PreparedStatement ps = conn.prepareStatement("INSERT INTO [dbo].[AllTypesTable] ([decimal18_0Col]) VALUES (?)"); 
ps.setObject(1, new BigDecimal(3.14)); 
ps.execute(); 

:ドキュメントは、小数点の列がBigDecimalのにマップすると言うので、私はこれをやろうとしています.SQLServerException:データ型nvarcharを10進数に変換中にエラーが発生しました。

ドライバはダブルスと幸せであるように見えるんので、私はこれを行うことができます。

ps.setObject(1, 3.14); 

は、どのように私は挿入を行うことができます私はBigDecimalのが私を与える余分な精度が必要な場合は?

更新:もちろん、私が3.14を挿入しようとすると、これについて心配する必要はありません。実際に10進精度が必要な値を挿入する場合はどうすればよいですか?例えば、小数点以下30桁の何か?

+0

代わりにsetBigDecimalを使用するとどうなりますか? BTW:これは明らかにバグです。JDBC標準(JDBC 4.1、付録B)では、JDBCドライバがnumericフィールド、bit、boolean、char、varcharおよびlongvarcharにBigDecimalを受け入れる必要があることを明示的に指定しています。 –

答えて

5

これはDBの問題ではないことが判明しました。 varcharからの変換に関するエラーは、基本的には値がDBフィールドに収まらないということです。これは、コマンドで送信された文字列から小数値に変換する必要があります。

実際、新しいBigDecimal(3.14)は、3.140000000003457234987のような値を持つBigDecimalを作成するという問題があります。これは、doubleが3.14を正確に格納できないためです。次に、この値をDBに送信すると、列の小数点以下5桁しかないため、この値は取得されません。 BigDecimalの新しいコンストラクタ、new BigDecimal( "3.14")を使用することです。これは正確に3.14を保持します。

+2

実際には、BigDecimalの位取り(小数点以下桁数)を設定することでこれを修正することもできます: 'BigDecimal amount = new BigDecimal(117.56d);' 'amount = amount.setScale(8、BigDecimal.ROUND_HALF_UP);' – Icegras

0

カラムのカラムのデータ型が10進数である限り、コードでの変換について心配する必要はありません。それをオブジェクトにキャストして、その方法で送信してみてください。

+0

オブジェクトにキャストすることが何を意味するか分かりません。 – TimK

+0

私はJavaに慣れ親しんでいるわけではありませんが、C#ではこのようなオブジェクトに戻すことができます: '(オブジェクト)value'。 –

0

コードからサーバーへのコマンドは文字列として使用されます。したがって、MSSQLがコマンドテキストを解析すると、3.14(2番目の例から)を10進数値に変換します。 "新しいBigDecimal(3.14)"は、文字列 "3,14"または他の無効な値に変換されている可能性があります。 値を設定した後、コマンド文をチェックしてみてください。

関連する問題