簡體   English   中英

DB2 jdbc SQL 錯誤:SQLCODE=-302,SQLSTATE=22001 on Select

[英]DB2 jdbc SQL Error: SQLCODE=-302, SQLSTATE=22001 on Select

我正在使用 DB2 JDBC 執行一個選擇查詢。 我正在使用 Prepared Statement 傳入參數的值。 數據庫中該參數的列長度為 12,因此一切正常,直到值的長度為 12,然后失敗。 拋出異常,錯誤消息如標題所示。 我做了一些搜索,並在以下鏈接http://www-01.ibm.com/support/docview.wss?uid=swg21319477 中找到了解釋,其中提到的分辨率如下

解決問題添加額外的客戶端驗證代碼以防止使用大於允許的最大長度的查詢。

我不想這樣做。 為什么查詢不返回而沒有結果。 知道我該怎么做嗎?

編輯

String sql = "select student_id, student_name from student where student_id = ?";

try (Connection connection = DBUtils.GetConnection)
{
    try (PreparedStatement statement = connection.prepareStatement(sql))
    {
        statement.setString(1, student_id);

        ResultSet result = statement.executeQuery();

        while (result.next())
        {
            //...
        }
    }
}

即使我不建議這樣做:我們有一個類似的問題,並發現 - 至少在我們的例子中 - 如果你真的想要空結果,你可以使用原生 SQL 查詢而不是准備好的語句。 顯然,它是准備好的語句的參數綁定運行到參數驗證中。 本機查詢(您將使用參數手動構建)似乎回避了此驗證,並且只返回了一個空結果。

(為了完整起見:如果真的從給定的參數手動構建 SQL 查詢,請確保知道您在做什么,驗證您的參數,並特別注意 SQL 注入。)

我要回答你的問題:

為什么查詢不返回卻沒有結果。 知道我該怎么做嗎?

包括數據庫管理系統在內的計算機程序會使用錯誤和警告來指示出現問題,以錯誤的方式使用或遇到可能的沖突或“危險”的情況。 在您的情況下,您嘗試使用不適合的值調用已定義的API。 程序拒絕接受該值,並通過返回錯誤代碼指出錯誤的調用。

如果不返回任何結果,您怎么知道API調用及其用法是錯誤的? 現在您知道並可以修復它。 或者使用異常處理忽略它並繼續...

這里的正確答案是@Gaius Gracchus 在他對@Hans 回答的評論中提供的替代建議。 您嘗試/捕獲 SQLException,收集其 SQL 狀態(總是比 SQL 代碼更好),並處理/拋出自定義異常以指示客戶端的無效輸入。 空的結果集(即使這是 OP 所希望的)是不准確的。 唯一的其他真正替代方案是增加列的大小或程序輸入/輸入輸出(不太可能)。

try {
    // sql bind or execute
}
catch (SQLException e) {
    String sqlState = e.getSQLState();
    if (sqlState != null && sqlState.equals("22001")) {
        throw new CustomException("Invalid input, etc");
    }
    throw e;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM