JDBC:使用 PreparedStatement 创建表,SQL 语法错误与否?
Posted
技术标签:
【中文标题】JDBC:使用 PreparedStatement 创建表,SQL 语法错误与否?【英文标题】:JDBC: Create Table with PreparedStatement, SQL Syntax Error or not? 【发布时间】:2012-09-05 10:51:55 【问题描述】:我在尝试以动态方式使用 PreparedStatement 创建新表时遇到了一些困难。我正在尝试添加未知数量的列及其各自的类型和大小。我不断收到 SQL 语法错误,但我怀疑这里可能不是这种情况。
使用的变量:
con = 连接对象 colNames = 包含列名(“person”、“email”等)的 String[] 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();
注意:是的,这是家庭作业。我不想要任何死的赠品,而是关于我以何种方式滥用某些功能的指针,我怀疑。
最好的问候, 克里斯
【问题讨论】:
根据您的 DBMS/JDBC 驱动程序,您还需要删除 SQL 字符串中的尾随;
【参考方案1】:
您需要将完整的 SQL 语句提供给 addBatch。它不是构造动态 SQL 语句的工具。它是运行多个语句时提高性能的工具。你在这里不需要它。
您在这里也不需要 PreparedStatement,因为您不会有绑定变量(即与列名相反的列数据)并且不会重复运行相同的 SQL(但这也不会造成伤害) )。 setString
和朋友不为列名或表名工作,只为数据工作。
StringBuilder 是构造带有可变部分的字符串的好工具。
【讨论】:
我多次运行 SQL 查询的某些部分(“colname coltype(typesize)”部分)和其他部分(“create table x (" and ");")只运行一次。因此,在这种情况下,我不确定该走哪条路。如果您认为这是最适合此任务的工具,我将研究此 StringBuilder。谢谢! 您不能运行部分查询。您只运行一次 CREATE TABLE 语句。整个事情是一个单一的声明,它必须是一个单一的发布。在将字符串提供给数据库之前,您需要使用完整的语句构造字符串。 我认为 addBatch() 做到了。但我用 StringBuilder 重写了它,它工作得很好。谢谢你:)以上是关于JDBC:使用 PreparedStatement 创建表,SQL 语法错误与否?的主要内容,如果未能解决你的问题,请参考以下文章
JDBC深入理解Statement和PreparedStatement
Java_JDBC使用Statement和PreparedStatement
JDBC:使用 PreparedStatement 创建表,SQL 语法错误与否?
JDBC:PreparedStatement.cancel() 的正确行为是啥
JDBC PreparedStatement.executeQuery() 的详细信息
com.mysql.jdbc.exceptions.MySQLSyntaxErrorException 使用 PreparedStatement 时