2009-11-03 5 views
2

SolarWinds 네트워크 성능 데이터베이스 (MS SQL 2005)에서 데이터를 검색하려고하는데, Orion 데이터베이스 관리자에서 대화 형으로 완벽하게 작동하는 쿼리는 JDBC를 통해 실행할 때 행을 반환하지 않습니다. 어떤 아이디어?JDBC 쿼리는 행을 반환하지 않지만 대화 형 쿼리는 수행합니까?

쿼리 자체가 충격적입니다 (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를 사용하고 쿼리가 작동했습니다.

+0

당신은 어떤 JDBC 문제를 배제하기 위해 다람쥐 SQL (http://squirrel-sql.sourceforge.net/)를 통해 실행을 시도 할 수 . –

+0

지금 작동하면 가장 가까운 대답을 수락하는 것이 가장 좋습니다. 귀하의 경우 PreparedStatement 사용을 제안한 답변을 수락해야합니다. 그렇지 않으면, 사람들은 당신에게 대답을하려고하지만, 당신은 이미 그 문제를 해결했습니다. 시간을 절약하십시오. –

답변

1

쿼리의 경우 날짜/타임 스탬프는 PreparedStatement#setDate()/setTimestamp()을 사용하여 설정해야합니다. SQL 삽입을 피할뿐만 아니라 날짜의 문자열 표현에서 실수를 포매팅하는 것을 방지합니다.

1

JDBC 구문은 SQL 문을 세미콜론으로 종료하지 않습니다.

읽어야 SQL 문자열의 마지막 절을 추가 라인 :

" order by rd.nodeid, rd.hr"); 
+0

좋은 지적이지만, 종료 세미콜론을 수락하는 것은 JDBC 드라이버에 의존한다는 점에 유의해야합니다. 그렇지 않으면 실제로 문제의 원인을 설명 할 것입니다. 필자는 MSSQL으로 일한 적이 없지만 Oracle과 PostgreSQL의 경우에는 MySQL JDBC 드라이버가이를 받아들이지 않습니다. DB2에 관해서는 잘 모르지만, 나는 지난 번 DB2를 사용했다. – BalusC

+0

나는 변화없이 세미콜론없이 시도했다. 나도 같은 증상으로 더 간단한 쿼리를 시도했습니다. ResponseID_Detail (평균 (PercentLoss), 0)을 응답으로 round (avg (AvgResponseTime), 0)로 hr, DATEPART (hh, DateTime) DateTime> = '2009-11-03'및 DateTime < '2009-11-04'groupid에 의한 그룹, DATEPART (hh, DateTime); DB 연결이 유효합니다. 즉, isValid (10)이 true를 반환합니다.하지만 대답은 연결과 관련이 있습니다. – Mike

+0

마이크의 문제가 다른 것으로 밝혀졌지만 여기에 세미콜론에 대한 자세한 내용이 있습니다. 세미콜론은 기술적으로 SQL 문의 일부가 아닙니다. 이것은 명령 행 인터페이스로 일반적으로 사용되는 명령문 종결 자 또는 구분 기호입니다. JDBC 4.0 스펙은 세미콜론을 언급하지 않지만 예제 SQL에 하나도 포함하지 않습니다. 저는 Oracle과 SQLServer를 모두 사용했습니다. 오라클은 오류를 제공합니다 : ORA-00911 잘못된 문자 제 이론은 SQL 문자열이 두 개의 명령문을 포함하고 마지막 명령문이 비어 있기 때문에 SQL Server가 빈 결과 집합을 반환한다는 것입니다. 나는 이것에 관해 확실하지 않다. – richj