3

PreparedStatement を使用して動的な方法で新しいテーブルを作成しようとすると、いくつかの問題が発生します。不明な数の列と、それぞれのタイプとサイズを追加しようとしています。SQL 構文エラーが発生し続けますが、ここではそうではないのではないかと思います。

使用される変数:

  • con = 接続オブジェクト
  • colNames = String[] 列名 ("person"、"email" など) を含む
  • colTypes = String[] 列の型 ("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();

注: はい、これは宿題です。私は死んだ景品は望んでいません。むしろ、私が疑っているいくつかの機能をどのように誤用しているかについてのポインタが欲しいです。

敬具、クリス

4

1 に答える 1

2

addBatch に完全な SQL ステートメントを指定する必要があります。動的 SQL ステートメントを作成するためのツールではありません。複数のステートメントを実行する際のパフォーマンスを向上させるためのツールです。ここでは必要ありません。

また、ここでは PreparedStatement も必要ありません。バインド変数 (つまり、列名ではなく列データ) を使用せず、同じ SQL を繰り返し実行しないためです (ただし、問題はありません)。setString友達は列やテーブル名では機能せず、データだけで機能します。

StringBuilder は、可変部分を持つ String を構築するための優れたツールです。

于 2012-09-05T10:59:08.163 に答える