工作破解查询的谜语

时间:2010-10-26 17:16:23

标签: c# sql oracle gridview odbc

我正在浏览我组织中另一位开发人员多年前编写的旧代码。在尝试改进此代码时,我发现它使用的查询有一个非常糟糕的问题。

  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中运行它时,您可以非常快速地学到这一事实。

奇怪的是什么?

此代码有效。

gridview绑定成功。 (它不会试图绑定到那个领域。)它已经在生产多年了。

所以,我的问题是......为什么?我从未见过错误的查询工作。我从未见过Oracle允许它或数据提供商破解它。

有谁知道这里发生了什么?

5 个答案:

答案 0 :(得分:7)

嗯......有几件事需要检查:

  1. 此代码是否实际运行?建议这样做似乎很愚蠢,但可能有一个更新的文件取代了这个。

  2. 您的代码是否会阻止异常? (任何想要列出这样的列的人肯定能够压制那些讨厌的异常)

  3. 是否被第三方代码压制了? (不太可能,但有时第三方代码更喜欢使用恼人的错误代码而不是例外)。

  4. 过去那些建议,我不确定。

    编辑:

    重新审视第二点,如果您在ASP.NET中工作,请检查是否存在压制异常的全局级异常处理程序。我在一个我工作的网站上遇到了这个问题,并在一天内发现了几十个例外。

答案 1 :(得分:4)

尝试运行

select * from v$sql where sql_fulltext like '%a.RRRAREQ_TRST_DESC%'
绑定网格后不久

。这将告诉您该语句是否真的被Oracle看到了。请注意,如果Oracle没有看到上述查询,您应该只看到上面的查询。

答案 2 :(得分:0)

使用ODBC跟踪日志查看此查询是否确实发送到数据库,并查看数据库返回的内容。然后使用任何其他基于ODBC的数据库工具,并检查此查询是否适用于此工具。作为终极测试,您可以编写简单的Python脚本。最简单的方法是使用包含odbc模块的ActiveState Python 2.x.测试代码如下:

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跟踪。

答案 3 :(得分:0)

如果我理解了原作者试图做的事情,并且使用横幅广告并不容易理解,那么这个查询应该是正确的:

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;

答案 4 :(得分:0)

好吧,让我们在误报警类别中提交。

我决定让我们的增值税从测试中发送DLL的副本。我用反射器拆开它,发现我的尴尬很多,查询是正确的。这是有道理的。

我仍然无法弄清楚为什么我的工作副本会有一个不正确的field_name。据我所知,本周之前我从未接触过这个文件。但是,SVN在以前的版本中没有任何显示此错误的历史记录。

太奇怪了......也许我正在失去理智。

感谢您对此问题的所有质量反馈。我当然学会了一些新的故障排除技术,因此我非常感激。 :)

快乐的编码, 克里夫