通過查看構建SQL的代碼很難嘗試調試SQL。
String sql = "INSERT INTO `ad`.`ad` (`imgURL`, `linkURL`, `client`, `idx`) VALUES ("
+ a.getImgURL() + " , " + a.getLinkURL() + " , " + a.getClient() + " , "
+ a.getIdx() + ");";
相反,檢查導致sql
字符串:
INSERT INTO `ad`.`ad` (`imgURL`, `linkURL`, `client`, `idx`) VALUES (fooURL, ...);
你應該能夠看到更容易,當你看,你的fooURL
周圍有沒有引號的SQL。因此它被解釋爲表達式,而不是簡單的標量字符串值。一個單詞的表達式只是假定爲一個列名稱,但廣告表中不存在該名稱的該列。
避免將字符串插入SQL語句會好得多。 Learn how to use prepared queries and query parameters instead.
String sql = "INSERT INTO `ad`.`ad` (`imgURL`, `linkURL`, `client`, `idx`) "
+ " VALUES (?, ?, ?, ?)";
PreparedStatement insertAd = con.prepareStatement(sql);
insertAd.setString(1, a.getImgUrl);
insertAd.setString(2, a.getLinkUrl);
insertAd.setInt(3, a.getClient);
insertAd.setInt(4, a.getIdx);
insertAd.executeUpdate();
您不需要引用或轉義查詢參數。使用參數要比記住平衡的引號標記要容易得多。出於這個原因,它也更安全,因爲你更有可能做到這一點。
再次感謝@Perception – drewmoore 2013-03-11 21:42:46