2009-07-17 28 views
1

繼承自一個在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

回答

1

此問題已被修復的人。數據庫權限有問題。捕捉並打印堆棧跟蹤

ResultSet rs = ps.executeQuery(); 

表示未找到查詢訪問的表。我仍然需要弄清爲什麼SQLException:JZ0S4:無法執行空的(零長度)查詢。

感謝您的時間和考慮。 Rohan

0

可以在執行查詢之前打印sql的內容嗎?我懷疑它正在丟失它的內容

+0

@rohangter:我不知道這個API,但是你運行了一個不同的查詢嗎? – 2009-07-17 16:53:16

1

回去直接從源文件複製代碼,然後編輯您的問題。你有一個潛在的歧義:你的第一個片段調用準備好的語句「preparedStatement」,然後你改變爲「prepareStatement」(沒有「d」)。仔細查看源代碼將使問題更容易分離。你有兩個變量還是你錯誤地輸入了你的例子?

[稍後...] 感謝您更新您的代碼。我沒有看到明顯的問題。你是否已經用調試器(例如,在Eclipse中)逐步完成它,以確保按預期調用這兩種方法?

+0

我很抱歉,我修復了這個對象的名字,它基本上和這兩個方法使用的PreparedStatment句柄一樣。 – 2009-07-17 17:11:55

0

var非null?是變種的正確類型(int,而不是字符串,我會想?)