2013-09-05 2 views
1

У меня есть запросResultSet приходит в пустой после выполнения запроса

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 пуста и не получают result.I отлажена, но не большую помощь?

Не могли бы вы дать мне знать Я пытаюсь исправить?

В Явах его определяется как ниже

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) 
+0

Предположим, что строка 'query' имеет правильную инструкцию sql. – user75ponic

+0

Строка запроса имеет тот же оператор. Я пытаюсь выполнить такой же оператор в db с замененными параметрами – constantlearner

+0

покажите нам строку запроса, как она определена внутри Java, пожалуйста. – Woot4Moo

ответ

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. базы данных

UPDATE

Я вижу, что вы используете RAW как тип данных, из этого post:

как описано в руководстве и справочник в Oracle JDBC разработчика ce 11g, при использовании столбца RAW вы можете рассматривать его как тип JDBC BINARY или VARBINARY , что означает, что вы можете использовать стандартные методы JDBC getBytes() и setBytes(), которые возвращают или принимают байт []. Другими параметрами являются использование специальных драйверов Oracle getRAW() и setRAW(), которые возвращают или принимают oracle.sql.RAW. Используя эти два варианта, вы должны развернуть и/или бросить на определенный класс реализации Oracle .

Кроме того, с точки зрения читаемости кода, ваше решение затрудняет принятие нового разработчика. Слишком часто я вижу, что люди заставляют sql быть «динамическими», когда на самом деле в 99% случаев вам не нужен этот уровень динамического построения запросов. Это звучит хорошо в головах большинства людей, но это просто вызывает боль и страдания в SDLC.

+0

Я отправляю это в какой-то код рамки, который я не могу изменить, он разработал в общем виде – constantlearner

+0

@constantlearner yeah «generic», я понимаю вашу боль :( – Woot4Moo

+0

В отладчике я вижу, что вижу, что он собирается блокировать и настраивать String – constantlearner

Смежные вопросы