简体   繁体   English

Java的SQL Server查询没有结果

[英]SQL Server query from Java gets no results

  • OS: Windows Server 2012 操作系统:Windows Server 2012
  • Database: SQL Server 2012 数据库:SQL Server 2012
  • Additional Software: jdk-7u51-windows-x64, apache-tomcat-7.0.50, Ant 1.9.3 附加软件:jdk-7u51-windows-x64,apache-tomcat-7.0.50,Ant 1.9.3

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM