Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java PreparedStatement语法问题_Java_Sql_Derby - Fatal编程技术网

Java PreparedStatement语法问题

Java PreparedStatement语法问题,java,sql,derby,Java,Sql,Derby,我在使用Java PreparedStatements时遇到了一些SQL语法错误问题 我试图准备的三个声明如下: insertBook = con.prepareStatement("INSERT INTO Books ? VALUES ?"); selectBooks = con.prepareStatement("SELECT * FROM Books?"); deleteBooks = con.prepareStatement("DELETE FROM Books?"); 在第一条语句中

我在使用Java PreparedStatements时遇到了一些SQL语法错误问题

我试图准备的三个声明如下:

insertBook = con.prepareStatement("INSERT INTO Books ? VALUES ?");
selectBooks = con.prepareStatement("SELECT * FROM Books?");
deleteBooks = con.prepareStatement("DELETE FROM Books?");
在第一条语句中,我想传入两个字符串,一个包含要插入的列的列表,另一个包含要插入的所有值。在另外两条语句中,我想在末尾插入一个(可选)WHERE子句

我已经看到了一个类似的问题,但在他的案例中,他似乎试图在没有意义的地方使用?s;除非我在SQL方面失败了,否则我看不出为什么我不能在这里插入字符串。我浏览了Javadoc,但似乎也找不到解释


非常感谢

它就是这样设计的-只保留参数,考虑使用<代码> StringBuilder <代码>来连接您的“WHO”子句。< /P> 这只是一个简单的例子,在这里您可能不使用
StringBuilder
,它对于构建复杂查询非常有效

这是你的例子

String whereClause = " WHERE Id = ?";

String insert = "INSERT INTO [Table](C1, C2) VALUES(?, ?)";
String select = "SELECT * FROM [Table] ";
String update = "UPDATE [Table] SET C1 = ? ";
String delete = "DELETE FROM [Table] ";

PreparedStatement insertSt = con.prepareStatement(insert);
PreparedStatement selectSt = con.prepareStatement(select + whereClause);
PreparedStatement deleteSt = con.prepareStatement(update + whereClause);
PreparedStatement updateSt = con.prepareStatement(delete + whereClause);

你的第一句话:

insertBook = con.prepareStatement("INSERT INTO Books ? VALUES ?");

我将从
值之后的第二个
开始。由于只有一个
占位符,因此只能向语句传递一个值。仅这一部分就使得JDBC无法实现您的目标。事实上,prepareStatement()至少对于某些驱动程序和数据库,会将语句发送到数据库服务器,指示它准备语句。此时,服务器将解析和规划语句,因此此时必须知道参数的列和数量。

JDBC中的“?”与底层DBMS协议支持的参数替换密切相关。但是,您正在尝试更改发送到数据库的实际SQL,而不是替换参数。

您不能这样使用
prepareStatement()
。为什么不连接字符串,然后将结果传递给方法?
StringBuilder
看起来很有希望。那么,在这种情况下,根本就没有办法使用
PreparedStatement
?我对JavaDB比较陌生。@lan Knight StringBuilder仅用于串接,您仍然需要使用PreparedStatement来执行查询