java - JDBC 查询不返回行,但交互式查询返回行?

标签 java jdbc

我正在尝试从 SolarWinds 网络性能数据库 (MS SQL 2005) 检索数据,并且在通过 JDBC 运行时(在 Orion 数据库管理器中)以交互方式完美运行的查询没有返回任何行。有什么想法吗?

查询本身令人震惊(我不喜欢 MS-SQL 日期/时间处理,我认为它会强制执行这样的按日期/小时连接的查询)。我可以通过 println 剪切和粘贴查询输出并且它工作正常,但在我的程序中它不返回任何行(但不抛出异常)。

我假设查询的复杂性无关紧要,因为 JDBC 不会尝试解析查询 - 它只会将其传递到后端。

String qtext = new String("select rd.nodeid, rd.hr, rd.response, rd.loss, cd.cpu, cd.mem, bd.nomem, bd.smmiss, bd.mdmiss, bd.bgmiss, bd.lgmiss, bd.hgmiss" + " from" +
    " (select nodeid,  DATEPART(hh, DateTime) as hr, round(avg(AvgResponseTime), 0) as response, round(avg(PercentLoss), 0) as loss" +
    "    from ResponseTime_Detail" +
    "    where DateTime >= " + today + " and DateTime < " + tomorrow +
    "    group by nodeid, DATEPART(hh, DateTime)" +
    " ) as rd" +
    " left outer join" +
    " (select nodeid,  DATEPART(hh, DateTime) as hr, round(avg(AvgLoad), 0) as cpu, bound(avg(AvgPercentMemoryUsed), 0) as mem" +
    "      from CPULoad_Detail" +
    "    where DateTime >= " + today + " and DateTime < " + tomorrow  +
    "      group by nodeid, DATEPART(hh, DateTime)" +
    " ) as cd" +
    " on rd.nodeid = cd.nodeid and rd.hr = cd.hr" +
    " left outer join" +
    "  (select nodeid,  DATEPART(hh, DateTime) as hr, round(avg(BufferNoMem), 0) as nomem, round(avg(BufferSmMiss), 0) as smmiss, round(avg(BufferSmMiss), 0) as mdmiss," +
    "          round(avg(BufferBgMiss), 0) as bgmiss, round(avg(BufferLgMiss), 0) as lgmiss, round(avg(BufferHgMiss), 0) as hgmiss" +
    "      from CiscoBuffers_Detail" +
    "    where DateTime >= " + today + " and DateTime < " + tomorrow +
    "      group by nodeid, DATEPART(hh, DateTime)" +
    " ) as bd" +
    " on rd.nodeid = bd.nodeid and rd.hr = bd.hr" +
    " order by rd.nodeid, rd.hr;");
 System.out.println("Query from hell = [" + qtext + "]");
 st = sol.db.createStatement();
 System.out.println("Created statement");
 rs = st.executeQuery(qtext);
 System.out.println("Executed statement");
 while (rs.next()) {
   ....
 }

感谢大家的建议。我认为问题出在日期/时间的解释上。我按照建议使用了 PreparedStatement,然后查询成功了。

最佳答案

关于您的查询,日期/时间戳将使用 PreparedStatement#setDate()/setTimestamp() 设置。不仅可以避免 SQL 注入(inject),还可以防止日期的字符串表示形式出现格式错误。

关于java - JDBC 查询不返回行,但交互式查询返回行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1670340/

相关文章:

java - 如何修复Servlet中Coverity(类似于veracode的安全工具)中的 "Trust boundary violation -Security Issue"?

Java JTable 导出到现有的 MS Access 表

java - JComboBox getSelectedItem

java - 通过java代码在MySQL删除命令中获取错误

c# - C# 和 java write() 之间的区别

java - 将自定义图标分配给 Mac 桌面元素

java - 如何检查值是否存在/为什么 ResultSet 在 SQLite 中关闭?

java - 如何检测SQ​​LException的SQL错误状态

java - 更新mysql中的记录时出现语法错误异常

java - 如何在java中使用系统dsn连接数据库?