SQLException:JZ0S4:无法执行空的(零长度)查询。准备好的声明

问题描述:

继承自一个在Connection上执行PreparedStatements的类。SQLException:JZ0S4:无法执行空的(零长度)查询。准备好的声明

public class doSomething { 
    private PreparedStatement ps; 

    public setPS (Connection conn) throws SQLException { 
     String sql = "select * from table where id = ?"; 
     ps = conn.prepareStatement(sql); 
    } 

    public void runSomething(String var){ 
     ps.setString(1,var); 
     ResultSet rs = ps.executeQuery(); 
     ... 
    } 
} 

我打电话

doSomethingInstance.setPS(conn); 
doSomethingInstance.runSomething(var); 

从另一个类,这会引发和异常的

ResultSet rs = ps.executeQuery(); 

唯一的例外是的SQLException:JZ0S4:无法执行空(零长度)查询。在准备好的声明上。我不明白为什么。有没有人看到Iam在这里做错了什么?

谢谢!

+0

很奇怪......如果声明真的是空的,setString()不应该先工作。你确定这是正确的/完整的代码吗? (“public setPS(...”不应该编译:缺少返回类型)不知道你在用什么数据库,但是“table”不是一个很好的表名,它是一个保留关键字(MySQL至少) – 2009-07-17 19:49:35

此问题已被修复的人。数据库权限有问题。捕捉并打印堆栈跟踪

ResultSet rs = ps.executeQuery(); 

表示未找到查询访问的表。我仍然需要弄清为什么SQLException:JZ0S4:无法执行空的(零长度)查询。

感谢您的时间和考虑。 Rohan

可以在执行查询之前打印sql的内容吗?我怀疑它正在丢失它的内容

+0

@rohangter:我不知道这个API,但是你运行了一个不同的查询吗? – 2009-07-17 16:53:16

回去直接从源文件复制代码,然后编辑您的问题。你有一个潜在的歧义:你的第一个片段调用准备好的语句“preparedStatement”,然后你改变为“prepareStatement”(没有“d”)。仔细查看源代码将使问题更容易分离。你有两个变量还是你错误地输入了你的例子?

[稍后...] 感谢您更新您的代码。我没有看到明显的问题。你是否已经用调试器(例如,在Eclipse中)逐步完成它,以确保按预期调用这两种方法?

+0

我很抱歉,我修复了这个对象的名字,它基本上和这两个方法使用的PreparedStatment句柄一样。 – 2009-07-17 17:11:55

var非null?是变种的正确类型(int,而不是字符串,我会想?)