Загадка рабочего неработающего запроса - PullRequest
14 голосов
/ 26 октября 2010

Я просматривал какой-то старый код, написанный в прошлые годы другим разработчиком в моей организации. Пытаясь улучшить этот код, я обнаружил, что в используемом им запросе возникла очень серьезная проблема.

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

Проблема в том, что столбец a.RRRAREQ_TRST_DESC не существует. Факт, который вы очень быстро изучаете, когда запускаете его в Oracle SQL Developer.

Странная вещь?

Этот код работает.

Вид сетки успешно связывается. (Это не пытается привязать к этой области.) И это было в производстве в течение многих лет.

Итак, мой вопрос ... почему? Я никогда не видел плохой запрос работы. Я никогда не видел, чтобы Oracle позволял это или провайдер данных взламывал это.

Кто-нибудь знает, что здесь происходит?

Ответы [ 5 ]

7 голосов
/ 26 октября 2010

Хммм ... Несколько вещей для проверки:

  1. Этот код действительно работает?Может показаться глупым предлагать это, но может быть более новый файл, который заменил этот.

  2. Исключение подавляется вашим кодом?(Любой, кто назовет такие столбцы, определенно способен подавить эти надоедливые исключения)

  3. Подавляется ли исключение сторонним кодом?(Не так вероятно, но иногда сторонний код предпочитает использовать надоедливые коды ошибок вместо исключений).

В прошлом эти предложения, я не уверен.

ПРАВИТЬ:

Возвращаясь ко 2-му пункту, если вы работаете в ASP.NET, убедитесь, что не существует обработчика исключений глобального уровня, который подавляет исключения.Я столкнулся с этой проблемой на одном сайте, над которым работал, и обнаружил десятки исключений за один день.

4 голосов
/ 26 октября 2010

Попробуйте запустить

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

вскоре после привязки сетки. Это скажет вам, было ли это заявление действительно замечено Oracle. Обратите внимание, что вы должны видеть вышеупомянутый запрос, только если он не был просмотрен Oracle.

0 голосов
/ 28 октября 2010

Хорошо, давайте подадим это в категорию ложной тревоги.

Я решил, чтобы наш НДС отправил копию DLL из теста.Я разобрал его с помощью рефлектора и, к моему смущению, обнаружил, что запрос правильный.Что имеет смысл.

Я до сих пор не могу понять, почему в моей рабочей копии было бы одно неверное имя field_name.Насколько мне известно, я никогда не трогал этот файл до этой недели.Но у SVN нет истории, показывающей эту ошибку в предыдущих версиях.

Так странно ... может быть, я схожу с ума.

Спасибо за все качественные отзывы по этому вопросу.Я, конечно, выучил несколько новых методов устранения неполадок, и за это я очень благодарен.:)

Удачного кодирования, Клиф

0 голосов
/ 27 октября 2010

Если я понимаю, что пытался сделать оригинальный автор, и с Banner, который никогда не бывает легко выяснить, тогда этот запрос должен быть правильным:

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 голосов
/ 27 октября 2010

Используйте журнал трассировки ODBC, чтобы увидеть, действительно ли этот запрос отправляется в базу данных, и посмотреть, что возвращает база данных.Затем используйте любой другой инструмент базы данных на основе ODBC и проверьте, работает ли этот запрос из этого инструмента.В качестве окончательного теста вы можете написать простой скрипт на Python.Самый простой способ использовать ActiveState Python 2.x с включенным модулем odbc.Тестовый код может выглядеть так:

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

Если в вашей программе не было ошибок и ошибок в других инструментах, сравните их трассировки ODBC.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...