Je tente d'extraire des données d'une base de données de performances réseau SolarWinds (MS SQL 2005) et une requête qui fonctionne parfaitement bien (dans le gestionnaire de base de données Orion) ne renvoie aucune ligne lors de l'exécution via JDBC. Des idées?La requête JDBC ne renvoie aucune ligne, mais la requête interactive le fait?
La requête elle-même est un shocker (je n'aime pas la gestion de la date et de l'heure MS-SQL qui, selon moi, force les requêtes de ce type pour les jointures par date/heure). Je peux couper et coller la sortie de la requête par println et cela fonctionne bien, mais dans mon programme, il ne renvoie aucune ligne (mais ne lance aucune exception).
Je suppose que la complexité de la requête n'a pas d'importance, car JDBC n'essaiera pas d'analyser la requête - elle la transmettra simplement à l'arrière-plan.
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()) {
....
}
Merci à tous pour vos suggestions. Je crois que le problème était avec l'interprétation des dates/heures. J'ai utilisé un PreparedStatement comme suggéré, et la requête a ensuite travaillé.
Vous pouvez essayer d'exécuter à travers pour écarter tout problème jdbc SQL Écureuil (http://squirrel-sql.sourceforge.net/) . –
Si cela fonctionne maintenant, alors la meilleure chose à faire est d'accepter la réponse la plus proche. Dans votre cas, vous devez accepter une réponse qui vous a suggéré d'utiliser PreparedStatement. Autrement, les gens essaieraient de vous donner une réponse, mais vous avez déjà résolu le problème. Gagnez du temps, s'il vous plaît. –