2012-04-10 3 views
3

SQL Server 용 MS JDBC 드라이버를 사용하고 십진수 (18,5) 열에 값을 삽입하려고합니다.SQL Server 소수 열에 어떻게 삽입합니까?

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를 소수로 변환하는 중 오류가 발생했습니다.

드라이버는 복식에 만족하실 것 같다 않는, 그래서 나는이 작업을 수행 할 수 있습니다

ps.setObject(1, 3.14); 

어떻게 삽입 할 수 있습니다 내가 BigDecimal를 내게주는 여분의 정밀도를 필요로하는 경우?

업데이트 : 물론 3.14를 삽입 할 경우 걱정할 필요가 없습니다. 실제로 10 진수 정밀도가 필요한 값을 삽입하려면 어떻게해야합니까? 소수점 이하 30 자리를 갖는 것, 예를 들면?

+0

대신 setBigDecimal을 사용하면 어떻게됩니까? BTW : 이것은 분명히 버그입니다. JDBC 표준 (JDBC 4.1, 부록 B)은 JDBC 드라이버가 숫자 필드, 비트, 부울, char, varchar 및 longvarchar에 대해 BigDecimal을 받아 들여야한다고 명시 적으로 지정합니다. –

답변

5

DB 문제가 전혀 없습니다. varchar에서 변환하는 중 오류는 기본적으로 값이 DB 필드에 맞지 않는다고 말합니다. 명령에서 보낸 문자열을 십진수 값으로 변환해야합니다.

사실 새로운 BigDecimal (3.14)은 3.140000000003457234987과 같은 값을 가진 BigDecimal을 만듭니다. 왜냐하면 double은 3.14를 정확히 저장할 수 없기 때문입니다. 그런 다음이 값을 DB로 보내면 소수 열 다섯 자리 만 있기 때문에이 값을 가져 오지 않습니다. 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

Object로 다시 캐스팅 한 것이 무슨 뜻인지 잘 모르겠습니다. – TimK

+0

자바에 익숙하지는 않지만 C#에서는 '객체 값'과 같은 객체로 다시 캐스팅합니다. –

0

코드에서 서버로 보내는 명령은 문자열로 사용됩니다. 따라서 MSSQL이 명령 텍스트를 구문 분석하면 3.14 (두 번째 예에서)를 10 진수 값으로 변환합니다. "새로운 BigDecimal (3.14)"는 "3,14"또는 다른 유효하지 않은 값으로 문자열로 변환됩니다. 값을 설정 한 후 명령문을 확인하십시오.

관련 문제