2012-04-07 4 views
2

나는 MySQL 데이터베이스를 가지고 있으며 Java 클래스의 테이블에 행을 삽입합니다. 다 잘 작동했지만 오늘은 이중 값을 삽입 할 수 없습니다. 값 대신 0이 삽입됩니다. 자바 코드입니다 :MySQL은 이중 값을 삽입하지 않습니다.

또한 str 문자열을 인쇄했으며, MySQL 쿼리 브라우저에서 실행하면 올바르게 삽입됩니다.

INSERT INTO PLAYERS (p_name, p_radius, p_lat, p_lon, p_offset) 
VALUES ('John', 5, 37.976088, 23.7358438, -1011) 

이 테이블 문을 만드는 것입니다 :

CREATE TABLE PLAYERS (player_id int(11) NOT NULL AUTO_INCREMENT, 
p_name varchar(30) DEFAULT NULL, 
p_lat double NOT NULL, 
p_lon double NOT NULL, 
p_score int(11) NOT NULL DEFAULT '0', 
p_highscore int(11) NOT NULL DEFAULT '0', 
p_game_id int(11) NOT NULL DEFAULT '0', 
p_status int(11) NOT NULL DEFAULT '0', 
p_radius int(11) NOT NULL, 
p_offset bigint(20) NOT NULL, 
PRIMARY KEY (player_id) 
) 

나는 삽입하는 동안 테이블을 확인, 나는 값이 올바르게 삽입되는 것을 보았다 str 문자열은 다음과 같다. 그 후 쿼리 브라우저를 새로 고칠 때 값은 0이었습니다 ... 그래서 매개 변수화 된 문은 차이를 만들지 않았습니다.


마지막으로 알았다. 대단히 죄송합니다. 실수였습니다! 내 응용 프로그램이 끝날 때 이러한 값을 0으로 설정하는 메서드가 있습니다. 귀하의 답변에 감사드립니다!

+0

PLAYERS 테이블에 대해 CREATE TABLE 문이 필요합니다. 제로를 찾는 열이 INT, DOUBLE/등이 아니라면 추측 할 수 있습니다. 또한 문자열 연결보다는 StringBuffer를 사용하십시오. –

+0

인서트에서 오류 메시지가 생성됩니까? 소수점에 대한 로캘 설정은 무엇입니까? – dasblinkenlight

답변

0

마지막으로, 나는 그것을 얻었다. 대단히 죄송합니다. 실수였습니다! 내 응용 프로그램을 닫을 때 이러한 값을 0으로 설정하는 메서드가 있습니다. 다시, 나는 정말로 유감 스럽다. 내 응용 프로그램이 꽤 큽니다 그래서 나는 이것을 즉시 볼 수 없었다. 귀하의 답변에 감사드립니다!

2

이및 PreparedStatement 매개 변수 값 제공 섹션을 살펴보십시오. 때로는 매개 변수화를 사용하지 않으면 복식 정밀도가 잘립니다. 다른 이유 중에는 정말 좋은 모범 사례입니다.

3

매개 변수화 된 문을 사용해야합니다. 대신에이 코드를 사용해보십시오 :

String str = "INSERT INTO PLAYERS (p_name, p_radius, p_lat, p_lon, p_offset) VALUES(?,?,?,?,?)"; 
PreparedStatement st = connection.prepareStatement(str, Statement.RETURN_GENERATED_KEYS); 
st.setString(1, p.getName()); 
st.setDouble(2, p.getRadius()); 
st.setDouble(3, p.getLatitude()); 
st.setDouble(4, p.getLongitude()); 
st.setInt(5, p.getOffset()); 
st.executeUpdate(); 
+0

감사! 이것은 작동하는 것 같습니다. 하지만 어제와 오늘까지 내 문자열이 왜 작동하는지 이해하지 못합니다. – Johny

+1

@Johny 무엇이 변경되었는지는 알 수 없지만 작업의 성공 또는 실패에 영향을 미칠 수있는 여러 가지 요인이 있습니다. 예를 들어, 문자열에 작은 따옴표가 포함되어 있거나 두 배가 유럽 스타일로 포맷 된 경우 (즉, 소수점 구분 기호로 ','를 사용하는 경우) 결과가 올바르지 않습니다. 그래서 매개 변수화 된 문을 사용해야합니다. 특히 SQL Injection (http://en.wikipedia.org/wiki/SQL_injection) 공격을 차단합니다. – dasblinkenlight

+0

자, 이제부터는 매개 변수가있는 명령문을 사용하겠습니다. 나는 나의 질문을 편집했다. 실제로 값이 올바르게 삽입 된 것을 볼 수 있지만 새로 고침을 누르면 값이 다시 0이됩니다 ... 미친 것입니다! – Johny

2

이 시도 :

String str = "INSERT INTO PLAYERS (p_name, p_radius, p_lat, p_lon, p_offset) VALUES (?, ?, ?, ?, ?)"; 

PreparedStatement st = connection.prepareStatement(str, Statement.RETURN_GENERATED_KEYS); 
st.setString(1, p.getName()); 
st.setDouble(2, p.getRadius()); 
st.setDouble(3, p.getLatitude()); 
st.setDouble(4, p.getLongitude()); 
st.setInt(5, p.getOffset()); 
st.executeUpdate();