Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.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 MySQLSyntaxErrorException“附近&引用;尝试执行PreparedStatement时_Java_Mysql_Jdbc - Fatal编程技术网

Java MySQLSyntaxErrorException“附近&引用;尝试执行PreparedStatement时

Java MySQLSyntaxErrorException“附近&引用;尝试执行PreparedStatement时,java,mysql,jdbc,Java,Mysql,Jdbc,我正在尝试使用Java中的PreparedStatement执行查询 当我试图执行我的查询时,我得到了错误号1064(语法错误) 我已经在MySQL查询浏览器中用替换值测试过了,效果很好 我的代码怎么了 以下是相关代码: String query = "select MemberID, MemberName from members where MemberID = ? or MemberName = ?"; Connection conn = DriverManager.getConnecti

我正在尝试使用Java中的PreparedStatement执行查询

当我试图执行我的查询时,我得到了错误号1064(语法错误)

我已经在MySQL查询浏览器中用替换值测试过了,效果很好

我的代码怎么了

以下是相关代码:

String query = "select MemberID, MemberName from members where MemberID = ? or MemberName = ?";
Connection conn = DriverManager.getConnection(DATABASE_URL, USERNAME, PASSWORD);
PreparedStatement s = conn.prepareStatement(query);
s.setInt(1, 2);
s.setString(2, "zen");
ResultSet rs = s.executeQuery(query);
以下是我得到的一个例外:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:您有一个 SQL语法错误;检查与您的产品相对应的手册 MySQL服务器版本的语法是否正确?或成员名 第1行的=?'

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: 您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以了解使用接近“”的正确语法?或第1行的MemberName=?'

MySQL不理解SQL查询中
的含义。这确实是无效的SQL语法。所以不知何故,它并没有被
PreparedStatement
所取代。你猜怎么着

PreparedStatement s = conn.prepareStatement(query);
s.setInt(1, intValue);
s.setString(2, strValue);        
rs = s.executeQuery(query); // Fail!
您正在用原始查询覆盖准备好的查询!您需要调用argumentless方法,而不是


与问题无关,您的代码正在泄漏资源。数据库将在几个小时后用完,应用程序将崩溃。要解决这个问题,您需要遵循JDBC的习惯用法,即在
try
块的
finally
块中关闭
连接
语句
结果集
。查看以获取更多详细信息。

如果查看for
语句(PreparedStatement的超类)
executeQuery(String)
executeUpdate(String)
的方法文档,请说:

注意:不能对
PreparedStatement
CallableStatement
调用此方法

这就是您在这里要做的:在
PreparedStatement
对象上从
Statement
调用
executeQuery(String)

既然javadocs说您“不能”这样做,那么您得到的实际行为是未指定的。。。而且可能依赖于JDBC驱动程序。在本例中,您使用的MySQL驱动程序似乎正在解释这一点,这意味着您正在以未准备好的语句进行更新,因此,
标记不会被解释为参数占位符。这导致服务器端SQL解析器说“语法错误”


(如果您这样做,如果MySQL驱动程序抛出不同的未经检查的异常,程序员会更容易;例如
UnsupportedOperationException
。但是,标准JDBC javadocs没有说明在这种情况下应该发生什么。这取决于供应商的驱动程序将执行什么操作。)

提供有关该异常的更多详细信息“error”-Java中的异常在调用executeQuery之前有StackTraces,我在调试期间看到参数被替换到PreparedStatemet中,查询变成“com.mysql.jdbc”。JDBC4PreparedStatement@6e9770a3:从MemberID=2或MemberName='zen'的成员中选择MemberID、MemberName“好吧,你已经提供了你的全部代码。这就是没有人回答的原因——太长了。隔离相关的位并只显示它们。这只是一个家庭作业,而且我截断了我的大部分代码,我有一个关闭所有相关资源的方法。我尝试过executeQuery(),现在可以工作了,谢谢:p JDBC规范确实说明了应该发生什么:应该抛出
SQLException
:“SQLException-如果发生数据库访问错误,则对关闭的语句调用此方法,给定的SQL语句生成除单个ResultSet对象以外的任何对象,对PreparedStatement或CallableStatement调用此方法”。但是,MySQL驱动程序仅在这种情况下“意外”执行此操作(如果传递的语句没有参数占位符,那么它的工作方式将与规范相反)。
PreparedStatement s = conn.prepareStatement(query);
s.setInt(1, intValue);
s.setString(2, strValue);        
rs = s.executeQuery(); // OK!