2012-10-05 48 views
1

嘗試從Java向Mysql中插入一些值時出現語法錯誤。從Java的INSERT MySql時出現語法錯誤

我的代碼如下所示:

date = new SimpleDateFormat("yyyy-MM-dd").parse(nextLine[0]); 
     java.sql.Timestamp sqlDate = new java.sql.Timestamp(date.getTime()); 
     st.executeUpdate("INSERT INTO " + tick + "(day, open, high, low, close, volume) VALUES (" + sqlDate + ", " + nextLine[1] + ", " + nextLine[2] + ", " + nextLine[3] + ", " + nextLine[4] + ", " + nextLine[5] + ")"); 

我的例外:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:您在您的SQL語法錯誤 ;檢查對應於您 MySQL服務器版本正確的語法近00使用手冊:00:00.0, 128.40,128.50,127.30,128.20,1415200)」在1號線

會很高興的任何幫助:)

+1

大約在日期? – Wiseguy

+0

請顯示您的查詢發送到db –

回答

6

雖然它可能只是修復立即語法錯誤,我會強烈建議反對它。你不應該直接在你的SQL中包含這些值。

而是使用參數化查詢通過PreparedStatement,並將您的值設置爲參數。在這種情況下,您當然會使用PreparedStatement.setTimestamp來設置該值 - 在首先將查詢更改爲參數化之後。參數化的SQL的

優點:

  • 預防SQL injection attacks
  • 避免容易出錯的字符串的轉換(如目睹了這種情況下)
  • 分離的代碼和數據的,導致SQL這是更簡單的閱讀
+0

謝謝。我會看看PreparedStatemet,看看我能得到它!我總共是MySql的新手,所以..:P – ZedIsDead

+0

@ZedIsDead:當你使用*任何*編程語言的任何*數據庫時,這是你應該做的事情。如果某些數據庫/語言對不支持它,迫使你直接構建SQL,那應該是一個警告信號...... –

+0

PS:「ZedIsDead」是對昆汀塔倫蒂諾電影或John Boorman電影的引用「 「昆汀·塔倫蒂諾對此表示敬意的」扎多斯「?還是其他什麼東西? – paulsm4

1

強烈建議:

1)創建一個Java字符串變量調用的executeUpdate(前)

2)確保您的字符串是引用的語法正確(日期值之間的逗號,等等等)

ALSO:

「準備」 是你的朋友;)

想你可能已經使用它們 ...但你並沒有表現出那部分代碼...我當然沒有看到任何地點標記(「?」)

但我認爲1)首先,和2)檢查字符串(例如,在你的調試器中)之前你的JDBC調用將是一個巨大的幫助...恕我直言......

0

日期需要在MySQL中被引用,所以你定義包裝sqlDate單引號:

st.executeUpdate("INSERT INTO " + tick + "(day, open, high, low, close, volume) VALUES ('" + sqlDate + "', " + nextLine[1] + ", " + nextLine[2] + ", " + nextLine[3] + ", " + nextLine[4] + ", " + nextLine[5] + ")"); 

我假設其他值是數字,因此是安全的沒有引號。

這種方法最大的問題是您易受SQL injection attacks的影響。您應該改用準備好的陳述代替:

PreparedStatement ps = conn.prepareStatement("INSERT INTO my_table(day, open, high, low, close, volume) VALUES (?,?,?,?,?,?)"); 
ps.setTimestamp(1, sqlDate); 
ps.setBigDecimal(2, nextLine[1]); 
...