2010-10-26 7 views
14

Przechodziłem przez stary kod napisany w przeszłości przez innego programistę z mojej organizacji. Próbując poprawić ten kod, odkryłem, że używane przez niego zapytanie miało bardzo poważny problem.Zagadka działającego, zepsutego zapytania

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(); 

Problemem jest to, że kolumny a.RRRAREQ_TRST_DESC nie istnieje. Fakt, że bardzo szybko się uczysz, gdy uruchamiasz go w Oracle SQL Developer.

Dziwna rzecz?

Ten kod działa.

Gridview wiąże pomyślnie. (Nie próbuje wiązać się z tym polem.) I był produkowany od lat.

Moje pytanie brzmi: dlaczego? Nigdy nie widziałem złego zapytania. Nigdy nie widziałem, żeby Oracle pozwalał na to, lub dostawca danych się z nim zhakował.

Czy ktoś ma pojęcie, co się tutaj dzieje?

+0

dziwne ... nie RRRAREQ_TRST_DESC kiedykolwiek istnieć? –

+15

Te nazwy kolumn sprawiają, że mój mózg boli –

+5

czy to powoduje wyjątek, który zostaje obsłużony, a coś ** innego ** wykonuje poprawne zapytanie i wiąże je? czy jesteś pozytywnie wykorzystany? nie jest to prawdziwy kod źródłowy, do którego nie ma odniesienia? –

Odpowiedz

7

Hmmm ... Kilka rzeczy do sprawdzenia:

  1. Czy ten kod rzeczywiście uruchomić? Sugerowanie tego może wydawać się głupie, ale może istnieć nowszy plik, który zastąpił ten.

  2. Czy wyjątek jest blokowany przez twój kod? (Każdy, kto nazwałby kolumny w ten sposób, byłby w stanie zlikwidować te brzydkie wyjątki)

  3. Czy wyjątek jest blokowany przez kod zewnętrzny? (Nie jest to prawdopodobne, ale czasami kod strony trzeciej woli używać denerwujących kodów błędów zamiast wyjątków).

Po tych sugestiach nie jestem pewien.

EDIT:

Revisiting 2nd punkt, jeśli pracują w ASP.NET sprawdzić, czy nie ma obsługi wyjątku światowy poziom, który jest squelching wyjątki. Wpadłem na ten problem w jednej witrynie, nad którą pracowałem i znalazłem dziesiątki wyjątków w ciągu jednego dnia.

+0

Jestem prawie pewien, że moje podstawy są uwzględnione w tych 3 liczbach, ponieważ faktycznie widzę dane w widoku siatki, które są wiążące dla tej tabeli. Kod, choć nie był zmieniany od lat, został wielokrotnie przepchnięty przez nasz proces wdrażania, więc jestem przekonany, że to ten sam kod. :) – clifgriffin

+4

Wystarczająco uczciwe - powodzenia w poprawianiu zapytania roboczego :) – riwalk

+0

Nawet jeśli widzisz dane w tabeli, nie masz pewności, czy rzeczywiście działa zapytanie. Czy próbowałeś dodać manekina-kolumny, "" SO "jako Dummy" i zobaczyć, czy to również pojawi się w widoku siatki? – Espo

4

Spróbuj uruchomić

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

wkrótce po wiązania siatki. Dzięki temu dowiesz się, czy oświadczenie rzeczywiście było widziane przez Oracle. Zauważ, że powyższe zapytanie powinieneś zobaczyć tylko wtedy, gdy nie było widziane przez Oracle.

+0

Podobnie, można uruchomić śledzenie za pomocą DBMS_MONITOR i sprawdzić zapytanie w pliku śledzenia. –

0

Użyj dziennika śledzenia ODBC, aby sprawdzić, czy to zapytanie jest rzeczywiście wysyłane do bazy danych i zobaczyć, co zwraca baza danych. Następnie użyj dowolnego innego narzędzia bazy danych opartego na ODBC i sprawdź, czy to zapytanie działa z tego narzędzia. Jako ostateczny test możesz napisać prosty skrypt w języku Python. Najłatwiejszy sposób użycia modułu ActiveState Python 2.x z modułem odbc w zestawie. Kod testowy może wyglądać następująco:

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]) 

Jeśli w twoim programie nie wystąpił błąd i wystąpił błąd w innych narzędziach, porównaj ich ślady ODBC.

0

Jeśli rozumiem co oryginalny autor starał się zrobić, i Banner, że nigdy nie jest łatwe, aby dowiedzieć się, czym ta kwerenda powinny być poprawne:

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

Cóż, złożyć to w fałszywym alarmem Kategoria.

Postanowiłem, że nasz VAT prześle kopię biblioteki DLL z testu. Wyciągnąłem go z reflektorem i znalazłem, ku mojemu zawstydzeniu, że zapytanie jest prawidłowe. To ma sens.

Nadal nie mogę zrozumieć, dlaczego moja kopia robocza ma jedną niepoprawną nazwę pola. Według mojej wiedzy, nigdy nie dotknąłem tego pliku przed tym tygodniem. Ale SVN nie ma historii pokazującej ten błąd w poprzednich wersjach.

Dziwne ... może tracę rozum.

Dziękuję za wszystkie opinie na temat tego pytania. Z pewnością nauczyłem się nowych technik rozwiązywania problemów i za to jestem bardzo wdzięczny. :)

Szczęśliwy kodowanie, Clif