3

SQL Server 用の MS JDBC ドライバーを使用しており、値を decimal(18,5) 列に挿入しようとしています。ドキュメントでは、10 進数の列は BigDecimal にマップされると書かれているため、これを実行しようとしています。

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

execute() の呼び出しで、次のエラーが発生します。

com.microsoft.sqlserver.jdbc.SQLServerException: データ型 nvarchar を 10 進数に変換中にエラーが発生しました。

ドライバーはダブルスに満足しているようなので、これを行うことができます:

ps.setObject(1, 3.14);

BigDecimal が提供する追加の精度が必要な場合、挿入を行うにはどうすればよいですか?

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

4

3 に答える 3

6

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

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

于 2012-04-11T11:13:02.580 に答える
0

コードからサーバーへのコマンドは文字列として送信されます。したがって、MSSQL がコマンド テキストを解析すると、3.14 (2 番目の例から) が 10 進数値に正常に変換されます。おそらく、「new BigDecimal(3.14)」は「3,14」またはその他の無効な値として文字列に変換されます。値を設定した後、コマンド ステートメントを確認してください。

于 2012-04-10T13:48:21.277 に答える
0

列 column のデータ型が decimal である限り、コードでの変換について心配する必要はありません。オブジェクトにキャストして、そのように送信してみてください。

于 2012-04-10T13:44:06.490 に答える