2012-09-05 90 views
2

我遇到了一些困難努力,以動態的方式,創建一個使用PreparedStatement的一個新表。我正在嘗試添加未知數量的列以及它們各自的類型和大小。我不斷收到SQL語法錯誤,但我懷疑這可能不是這種情況。JDBC:使用PreparedStatement創建表,SQL語法錯誤與否?

中使用的變量:

  • CON =連接對象
  • colNames =字符串[]包含列名( 「人物」, 「電子郵件」 等)
  • colTypes =字符串[]含有列類型( 「VARCHAR」, 「INT」 等)
  • colSizes =字符串[]續(「100」,「11」等)

應該是不言而喻的。

con.setAutoCommit(false); 
String sql = "? ?(?),"; 
PreparedStatement ps = con.prepareStatement(sql); 
ps.addBatch("create table " + tablename + "("); 

for (int i = 0; i < colNames.length; i++){ 

    if (!(i == colNames.length-1)) { 
     ps.setString(1, colNames[i]); 
     ps.setString(2, colTypes[i]); 
     ps.setString(3, colSizes[i]); 

    } else { 
     String format = "%s %s(%s)"; 
     String lastLine = String.format(format, colNames[i], colTypes[i], colSizes[i]); 
     ps.addBatch(lastLine); 

    } 
} 

ps.addBatch(");"); 
ps.executeBatch(); 

注意:是的,這是作業。我不想要任何死亡的贈品,而是指出我以什麼方式濫用某些功能,這是我懷疑的。

最好的問候, Krys

+0

根據您的DBMS/JDBC驅動程序,您還需要刪除SQL字符串中尾隨的';' –

回答

2

你需要給完整的SQL語句addBatch。它不是構建動態SQL語句的工具。它是運行多個語句時提高性能的工具。這裏你不需要它。

在這裏您也不需要PreparedStatement,因爲您不會綁定變量(即列數據而不是列名),並且不會重複運行相同的SQL(但它不會影響,其一)。 setString和朋友不適用於列名或表名,只適用於數據。

一個StringBuilder是構造具有可變部分字符串的良好工具。

+0

我正在多次運行SQL查詢的某些部分(「colname coltype(typesize)」部分)和其他「創建表x(」和「);」)只有一次。因此,在這種情況下,我不確定要走哪條路。 我會考慮這個StringBuilder的,如果你認爲是這個任務的最合適的工具。 謝謝! – krystah

+0

您無法運行部分查詢。您只運行一次CREATE TABLE語句。整個事情是一個單一的聲明,它必須一起發佈。在將其提交給數據庫之前,需要用完整的語句構造String。 – Thilo

+0

我想addBatch()這樣做。但我的StringBuilder改寫了它,它工作得很好。謝謝 :) – krystah