ResultSet在执行查询后变为空

时间:2013-09-05 12:11:35

标签: sql jdbc

我有一个查询

SELECT instance_guid FROM service_instances WHERE service_template_guid='E578F99360A86E4EE043C28DE50A1D84' AND service_family_name='TEST'

直接执行此操作会返回

4FEFDE7671A760A8DC8FC63CFBFC8316
F2F9DF641D8E2CACC03175A7A628D51D

现在我正在尝试使用JDBC中的相同代码。

 PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            conn = executionContext.getConnection();
            if (conn != null) {
                ps = (PreparedStatement)conn.prepareStatement(query);
                if (params == null) params = new Object[0];
                for (int i=0;i<params.length;i++) {
                    if (params[i] instanceof Integer) {
                        ps.setInt(i+1, ((Integer)params[i]).intValue());
                    } else if (params[i] instanceof java.util.Date) {                        
                        ((PreparedStatement)ps).setDATE(i+1, new oracle.sql.DATE((new java.sql.Timestamp(((Date)params[i]).getTime()))));
                        //ps.setObject(i+1, new oracle.sql.DATE(new Time(((Date)params[i]).getTime())));
                    } else {
                        if (params[i] == null) params[i] = "";
                        ps.setString(i+1, params[i].toString());
                    }
                }

                rs = ps.executeQuery();

我看到params[0] =E578F99360A86E4EE043C28DE50A1D84 and params[1]=TEST

但是resultSet是空的并且没有得到结果。我已经调试但没有多大帮助?

你能告诉我我正在尝试吗?

在java中定义如下

  final static private String INSTANCE_GUID_BY_TEMPLATE_GUID = 
    "SELECT instance_guid FROM service_instances WHERE service_template_guid=? AND service_family_name=? "

SERVICE_FAMILY_NAME          NOT NULL VARCHAR2(256)  
SERVICE_TEMPLATE_GUID        NOT NULL RAW(16 BYTE)  

1 个答案:

答案 0 :(得分:3)

首先,这会破坏我见过的每个sql映射模式。

String sql = "SELECT instance_guid FROM service_instances WHERE service_template_guid=? AND service_family_name=?";
PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            conn = executionContext.getConnection();  
            ps = conn.prepareStatement(sql);  
            ps.setString(1,guid);  
            ps.setString(2,family);  
            rs = ps.executeQuery();  
            while(rs.next(){...}  
           ...  
       }

除非您尝试将一些代码写入从数据库X到数据库Y的端口,否则您不应该动态地计算出数据类型。

更新

我发现您使用RAW作为数据类型,来自post

  

如Oracle JDBC Developer的指南和参考11g中所述,   使用RAW列时,可以将其视为BINARY或VARBINARY   JDBC类型,这意味着您可以使用JDBC标准方法   getBytes()和setBytes()返回或接受byte []。另一个   选项是使用Oracle驱动程序特定的扩展getRAW()和   setRAW()返回或接受oracle.sql.RAW。使用这两个会   要求您解包和/或强制转换为特定的Oracle   实施班。

此外,从代码可读性的角度来看,您的解决方案使新开发人员难以接管。我经常看到人们让sql变得“动态”,而实际上99%的时候你不需要这种级别的动态查询构建。在大多数人的头脑中听起来不错,但它只会导致SDLC的疼痛和痛苦。