這使我瘋狂......我在這裏做錯了什麼?Java PreparedStatement抱怨execute()上的SQL語法
ArrayList<String> toAdd = new ArrayList<String>();
toAdd.add("password");
try{
PreparedStatement pStmt = conn.prepareStatement("ALTER TABLE testTable ADD ? varchar(100)");
for (String s : toAdd) {
pStmt.setString(1, s);
pStmt.execute();
}
} catch (SQLException e) {
e.printStackTrace();
}
結果...
02:59:12885錯誤[STDERR] com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:您的SQL語法錯誤;檢查對應於你的MySQL服務器版本正確的語法使用近「」密碼「VARCHAR(100)」在1號線
的手冊,但...
ArrayList<String> toAdd = new ArrayList<String>();
toAdd.add("password");
try{
Statement stmt = conn.prepareStatement();
for (String s : toAdd) {
stmt.execute("ALTER TABLE testTable ADD "+s+" varchar(100)");
}
} catch (SQLException e) {
e.printStackTrace();
}
作品完美地..所以直接將文本直接輸入MySQL命令行客戶端。
mysql> alter table testTable add stringGoesHere varchar(100);
Query OK, 1 row affected (0.23 sec)
Records: 1 Duplicates: 0 Warnings: 0
我在做什麼錯?
啊,謝謝。我會給你一個upvote,但它不會讓我呢。;) – Mike 2011-06-14 07:41:58
在Oracle,SQL Server,DB2,Teradata和我所使用過的每個其他關係數據庫中都可以找到相同的限制。限制與優化程序處理SQL語句的方式有關。在執行查詢計劃時,綁定值在處理中提供*太晚*。對於語法檢查,關鍵字需要提前提供。在開發/選擇查詢計劃之前,必須在語義檢查期間識別表,列,函數等。執行查詢計劃之前不會提供綁定值。 – spencer7593 2016-03-24 14:35:02