3

我在尝试以动态方式使用 PreparedStatement 创建新表时遇到了一些困难。我正在尝试添加未知数量的列及其各自的类型和大小。我不断收到 SQL 语法错误,但我怀疑这里可能不是这种情况。

使用的变量:

  • con = 连接对象
  • colNames = String[] 包含列名(“person”、“email”等)
  • colTypes = String[] 包含列类型(“varchar”、“int”等)
  • colSizes = String[] 包含列大小(“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();

注意:是的,这是家庭作业。我不想要任何死的赠品,而是关于我以何种方式滥用某些功能的指针,我怀疑这一点。

最好的问候, 克里斯

4

1 回答 1

2

您需要将完整的 SQL 语句提供给 addBatch。它不是构造动态 SQL 语句的工具。它是运行多个语句时提高性能的工具。你在这里不需要它。

您在这里也不需要 PreparedStatement,因为您不会有绑定变量(即列数据而不是列名),也不会重复运行相同的 SQL(但也不会受到伤害)。setString和朋友不为列名或表名工作,只为数据工作。

StringBuilder 是构造带有可变部分的字符串的好工具。

于 2012-09-05T10:59:08.163 回答