2012-04-07 106 views
2

我有一個MySQL數據庫,並且我將行插入Java類的表中。一切正常,但今天,我不能插入雙值。而不是值,插入0。這是我在Java代碼:MySQL不會插入雙精度值

String str = "INSERT INTO PLAYERS (p_name, p_radius, p_lat, p_lon, p_offset) "; 
str += "VALUES ('"+p.getName()+"', "+p.getRadius()+", "; 
str += p.getLatitude()+", "+p.getLongitude()+", "+p.getOffset()+")"; 

PreparedStatement st = connection.prepareStatement(str, Statement.RETURN_GENERATED_KEYS); 
st.executeUpdate(); 

我也打印了str字符串,當我在MySQL查詢瀏覽器上執行它時,它被正確插入。字符串str如下:

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) 
) 

我在插入過程中檢查的表,我看到正確地插入值。之後,當我刷新查詢瀏覽器的值再次爲0 ...所以參數化的語句沒有什麼不同。


最後,我明白了。我非常抱歉,這是我的錯!當我的應用程序結束時,我有一個方法將這些值設置爲0。謝謝您的反饋!

+0

我們需要PLAYERS表的CREATE TABLE語句 - 我猜如果你找到零的列是INT,而不是DOUBLE/etc。此外,使用StringBuffer,而不是你正在進行的字符串連接。 – 2012-04-07 17:45:09

+0

插入是否生成任何錯誤消息?小數點的區域設置是什麼? – dasblinkenlight 2012-04-07 17:46:34

回答

0

最後,我得到了它。我非常抱歉,這是我的錯!當我的應用程序關閉時,我有一個方法將這些值設置爲0。再次,我真的很抱歉。我的應用程序非常龐大,所以我無法立即看到。謝謝您的反饋!

2

看看這個Link和爲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 2012-04-07 18:00:42

+1

@Johny我不知道可能發生了什麼變化,但是有很多因素可能會影響手術的成功或失敗。例如,如果字符串包含單引號字符或雙打格式爲歐式(即用','作爲小數分隔符),則結果將不正確。這就是爲什麼你應該使用參數化語句:除其他外,它可以防止[SQL注入](http://en.wikipedia.org/wiki/SQL_injection)攻擊。 – dasblinkenlight 2012-04-07 18:42:48

+0

好的,所以從現在起我將使用參數化語句。我編輯了我的問題。我實際上看到了正確插入的值,但是當我刷新時值再次爲零......這是瘋了! – Johny 2012-04-07 18:56:47

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();