[英]SQL Server query from Java gets no results
I'm migrating a website from Linux/MySQL to Windows/SQL Server. 我正在将网站从Linux / MySQL迁移到Windows / SQL Server。 One of the problems I have: I'd like to execute the SQL query
我遇到的问题之一:我想执行SQL查询
SELECT
r.PatientID, r.StudyDate, r.StudyTime, MeanCTDIvol_in_mGy,
@@ROWCOUNT as 'rowcount'
FROM
report r
INNER JOIN
ct_irradiation_events e ON r.rdsr_id = e.rdsr_id
INNER JOIN
patient_age_categories a ON (DATEDIFF(day, r.PatientsBirthDate, r.StartOfXrayIrradiation) <= a.max_age_days AND DATEDIFF(day, r.PatientsBirthDate, r.StartOfXrayIrradiation) >= a.min_age_days AND a.description = 'Erwachsene') WHERE MeanCTDIvol_in_mGy IS NOT NULL AND r.DeviceObserverUID = '2.25.80710267121025297646217319020776291293' AND ProcedureCodeShort = 'CTBTHABDA'AND e.CTAcquisitionType != 'Constant Angle Acquisition' AND DATEDIFF(day, '2013-11-20', r.StudyDate) >=0 AND DATEDIFF(day, '2014-02-20', r.StudyDate) <=0;
When I execute it in SQL Server Management Studio, I receive the result. 当我在SQL Server Management Studio中执行它时,我收到了结果。 When executing the same in java via JDBC I do not receive a result.
通过JDBC在Java中执行相同操作时,我没有收到结果。
How I like to do it (only a snippet of the code): 我喜欢怎么做(只是一小段代码):
conn = EstablishDBConnection();
PreparedStatement pst = null;
ResultSet rs = null;
try {
String sQuery = "SELECT r.PatientID, r.StudyDate, r.StudyTime, " + measure + ", @@ROWCOUNT as 'rowcount' FROM report r INNER JOIN ct_irradiation_events e ON r.rdsr_id=e.rdsr_id INNER JOIN patient_age_categories a ON (DATEDIFF(day, r.PatientsBirthDate, r.StartOfXrayIrradiation) <= a.max_age_days AND DATEDIFF(day, r.PatientsBirthDate, r.StartOfXrayIrradiation) >= a.min_age_days AND a.description = ?) WHERE " + measure + " IS NOT NULL AND r.DeviceObserverUID = ? AND ProcedureCodeShort = ? AND e.CTAcquisitionType != 'Constant Angle Acquisition' AND DATEDIFF(day, ?, r.StudyDate) >=0 AND DATEDIFF(day, ?, r.StudyDate) <=0;";
pst = conn.prepareStatement(sQuery);
pst.setString(1, agedescription);
pst.setString(2, devicecode);
pst.setString(3, proccode);
pst.setString(4, date_from);
pst.setString(5, date_until);
rs = pst.executeQuery();
noOfValues = rs.getInt("rowcount");
servlet_context.log("noOfValues: " + noOfValues);
DBValues = new double[noOfValues];
while (rs.next()) {
JSONArray jRow = new JSONArray();
jRow.put(rs.getDate("StudyDate").toString() + " " + rs.getTime("StudyTime").toString());
jRow.put(rs.getDouble(measure));
jRow.put(rs.getString("PatientID"));
jData.put(jRow);
DBValues[i] = rs.getDouble(measure);
i++;
}
I've also tried: 我也尝试过:
conn = EstablishDBConnection();
PreparedStatement pst = null;
ResultSet rs = null;
try {
pst = conn.prepareStatement("SELECT r.PatientID, r.StudyDate, r.StudyTime, MeanCTDIvol_in_mGy, @@ROWCOUNT as 'rowcount' FROM report r INNER JOIN ct_irradiation_events e ON r.rdsr_id=e.rdsr_id INNER JOIN patient_age_categories a ON (DATEDIFF(day, r.PatientsBirthDate, r.StartOfXrayIrradiation) <= a.max_age_days AND DATEDIFF(day, r.PatientsBirthDate, r.StartOfXrayIrradiation) >= a.min_age_days AND a.description = 'Erwachsene') WHERE MeanCTDIvol_in_mGy IS NOT NULL AND r.DeviceObserverUID = '2.25.80710267121025297646217319020776291293' AND ProcedureCodeShort = 'CTBTHABDA'AND e.CTAcquisitionType != 'Constant Angle Acquisition' AND DATEDIFF(day, '2013-11-20', r.StudyDate) >=0 AND DATEDIFF(day, '2014-02-20', r.StudyDate) <=0;");
rs = pst.executeQuery();
The variable "measure" is defined further up in the code. 变量“ measure”在代码中进一步定义。 However, both versions do not give me a result and finnaly I get java.lang.NullPointerException when trying to read the the empty result.
但是,两个版本都没有给我结果,并且最终当我尝试读取空结果时得到java.lang.NullPointerException。
Other queries work just fine, so the connection to the data base works (at least partly). 其他查询工作正常,因此与数据库的连接有效(至少部分有效)。 I don't have any other error in the logs expect from:
我预期日志中没有其他错误:
Feb 20, 2014 3:49:48 PM org.apache.catalina.core.ApplicationContext log
INFO: The result set has no current row.
Feb 20, 2014 3:49:48 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [RDSRServlet] in context with path [/RDSRServlet] threw exception
java.lang.NullPointerException
at ch.ksa.rdsr.web.DatabaseJSON.getCtTimeline(Unknown Source)
Thank you for any help! 感谢您的任何帮助!
Edit 编辑
Query that works: 有效的查询:
String sQuery = "SELECT id, DeviceObserverName, DeviceObserverUID FROM devices WHERE Modality = ? ORDER BY DeviceObserverName ASC, id ASC;";
pst = conn.prepareStatement(sQuery);
pst.setString(1, modcode);
rs = pst.executeQuery();
measure is MeanCTDIvol_in_mGy as can be seen in the second try i made. 度量是MeanCTDIvol_in_mGy,如我第二次尝试所见。
The problem was that 问题是
noOfValues = rs.getInt("rowcount");
came before 来过
rs.next()
I have to change to code then it'll work. 我必须更改为代码,然后它才能工作。 I'll store the results in an ArrayList so I don't have to know the number of results at the beginning.
我将结果存储在ArrayList中,因此不必一开始就知道结果数。 Thanks anyway.
不管怎么说,还是要谢谢你。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.