2010-10-26 6 views
14

Estaba revisando un código antiguo que otro desarrollador de mi organización escribió en años anteriores. Mientras trataba de mejorar este código, descubrí que la consulta que utiliza tenía un problema muy grave.El enigma de la consulta rota de trabajo

OdbcDataAdapter financialAidDocsQuery = 
      new OdbcDataAdapter(
       @"SELECT a.RRRAREQ_TREQ_CODE, 
          b.RTVTREQ_SHORT_DESC, 
          a.RRRAREQ_TRST_DESC, 
          RRRAREQ_STAT_DATE, 
          RRRAREQ_EST_DATE, 
          a.RRRAREQ_SAT_IND, 
          a.RRRAREQ_SBGI_CODE, 
          b.RTVTREQ_PERK_MPN_FLAG, 
          b.RTVTREQ_PCKG_IND, 
          a.RRRAREQ_MEMO_IND, 
          a.RRRAREQ_TRK_LTR_IND, 
          a.RRRAREQ_DISB_IND, 
          a.RRRAREQ_FUND_CODE, 
          a.RRRAREQ_SYS_IND 
        FROM  FAISMGR.RRRAREQ a, FAISMGR.RTVTREQ b 
        WHERE a.RRRAREQ_TREQ_CODE = b.RTVTREQ_CODE 
          and a.RRRAREQ_PIDM = :PIDM 
          AND a.RRRAREQ_AIDY_CODE = :AidYear ", 
       this.bannerOracle); 
     financialAidDocsQuery.SelectCommand.Parameters.Add(":PIDM", OdbcType.Int, 32).Value = this.pidm; 
     financialAidDocsQuery.SelectCommand.Parameters.Add(":AidYear", OdbcType.Int, 32).Value = this.aidYear; 
     DataTable financialAidDocsResults = new DataTable(); 
     financialAidDocsQuery.Fill(financialAidDocsResults); 
     FADocsGridView.DataSource = financialAidDocsResults; 
     FADocsGridView.DataBind(); 

El problema es que la columna a.RRRAREQ_TRST_DESC no existe. Un hecho que aprendes muy rápido cuando lo ejecutas en Oracle SQL Developer.

Lo extraño?

Este código funciona.

La vista de cuadrícula se une correctamente. (No intenta vincularse a ese campo.) Y ha estado en producción durante años.

Entonces, mi pregunta es ... ¿por qué? Nunca he visto funcionar una mala consulta. Nunca he visto a Oracle permitirlo o un proveedor de datos hackearlo.

¿Alguien tiene alguna idea de lo que está pasando aquí?

+0

Extraño ... no siempre existe RRRAREQ_TRST_DESC? –

+15

Esos nombres de columna hacen daño a mi cerebro –

+5

¿causa una excepción que se maneje, y algo ** else ** está haciendo una consulta válida y vinculando eso? ¿Estás seguro de que es realmente utilizado? no es un código vestigal que no está referenciado en realidad? –

Respuesta

7

Hmmm ... Algunas cosas a comprobar:

  1. ¿Esto realmente se ejecutan código? Puede parecer una tontería sugerir esto, pero puede haber un archivo más nuevo que haya reemplazado a este.

  2. ¿El código es una excepción? (Cualquiera que nombre columnas como esta es definitivamente capaz de silenciar esas molestas excepciones)

  3. ¿La excepción es sofocada por un código de terceros? (No es probable, pero a veces el código de terceros prefiere usar códigos de error molestos en lugar de excepciones).

Pasadas esas sugerencias, no estoy seguro.

EDIT:

Revisando el segundo punto, si está trabajando en ASP.NET, compruebe que no hay ningún controlador de excepciones a nivel mundial que está squelching excepciones. Me encontré con ese problema en un sitio en el que trabajé y encontré docenas de excepciones en un solo día.

+0

Estoy bastante seguro de que mi base está cubierta en esos 3 conteos porque realmente puedo ver los datos en la vista de cuadrícula que son vinculantes para esa tabla. El código, aunque no ha sido modificado en años, ha sido impulsado a través de nuestro proceso de implementación muchas veces, así que estoy seguro de que es el mismo código. :) – clifgriffin

+4

Lo suficientemente justo - la mejor de las suertes arreglar su consulta de trabajo :) – riwalk

+0

Incluso si puede ver los datos en la tabla, no está seguro de que se está ejecutando la consulta real. ¿Has intentado agregar una columna ficticia, "SO" como falso "y ver si eso también aparece en la vista de cuadrícula? – Espo

4

intente ejecutar

select * from v$sql where sql_fulltext like '%a.RRRAREQ_TRST_DESC%' 

poco después de que ates la red. Eso le dirá si la declaración fue realmente vista por Oracle. Tenga en cuenta que solo debe ver la consulta anterior si Oracle no la vio.

+0

De manera similar, puede ejecutar un rastreo con DBMS_MONITOR y verificar la consulta en el archivo de rastreo. –

0

Utilice el registro de seguimiento ODBC para ver si esta consulta se envía realmente a la base de datos y vea qué base de datos devuelve. Luego use cualquier otra herramienta de base de datos basada en ODBC y verifique si esta consulta funciona desde esta herramienta. Como última prueba, puede escribir secuencias de comandos de Python simples. La forma más sencilla de usar ActiveState Python 2.x con el módulo odbc incluido. Código de ensayo puede verse como:

import odbc 

connection = odbc.odbc('dnsname/user/password') 
cursor = connection.cursor() 
cursor.execute("select ...") 
for row in cursor.fetchall(): 
    print '\t'.join([str(r) for r in row]) 

Si no hubo un error en su programa y un error en otras herramientas a continuación, comparar los suyos rastreos de ODBC.

0

Si entiendo lo que el autor original estaba tratando de hacer, y con la bandera que nunca es fácil de averiguar, a continuación, esta consulta debe ser correcta:

SELECT a.rrrareq_treq_code, 
     b.rtvtreq_short_desc, 
     c.rtvtrst_desc, 
     rrrareq_stat_date, 
     rrrareq_est_date, 
     a.rrrareq_sat_ind, 
     a.rrrareq_sbgi_code, 
     b.rtvtreq_perk_mpn_flag, 
     b.rtvtreq_pckg_ind, 
     a.rrrareq_memo_ind, 
     a.rrrareq_trk_ltr_ind, 
     a.rrrareq_disb_ind, 
     a.rrrareq_fund_code, 
     a.rrrareq_sys_ind 
FROM faismgr.rrrareq a, 
     faismgr.rtvtreq b, 
     faismgr.rtvtrst c 
WHERE a.rrrareq_treq_code = b.rtvtreq_code 
AND a.rrrareq_trst_code = c.rtvtrst_code 
AND a.rrrareq_pidm = :PIDM 
AND a.rrrareq_aidy_code = :AidYear;
0

Bueno, vamos De momento, esto en la falsa alarma categoría.

Decidí hacer que nuestro IVA envíe una copia de la DLL de la prueba. Lo desmonté con un reflector y descubrí, para mi vergüenza, que la consulta es correcta. Lo cual tiene sentido.

Todavía no puedo entender por qué mi copia de trabajo tendría un nombre de campo incorrecto. Que yo sepa, nunca había tocado este archivo antes de esta semana. Pero, SVN no tiene ningún historial que muestre este error en versiones anteriores.

Tan extraño ... tal vez me estoy volviendo loco.

Gracias por todos los comentarios de calidad sobre esta pregunta. Ciertamente aprendí algunas nuevas técnicas de solución de problemas y por eso estoy muy agradecido. :)

feliz codificación, Clif

Cuestiones relacionadas