我正在浏览我组织中另一位开发人员多年前编写的旧代码。在尝试改进此代码时,我发现它使用的查询有一个非常糟糕的问题。
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允许它或数据提供商破解它。
有谁知道这里发生了什么?
答案 0 :(得分:7)
嗯......有几件事需要检查:
此代码是否实际运行?建议这样做似乎很愚蠢,但可能有一个更新的文件取代了这个。
您的代码是否会阻止异常? (任何想要列出这样的列的人肯定能够压制那些讨厌的异常)
是否被第三方代码压制了? (不太可能,但有时第三方代码更喜欢使用恼人的错误代码而不是例外)。
过去那些建议,我不确定。
编辑:
重新审视第二点,如果您在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在以前的版本中没有任何显示此错误的历史记录。
太奇怪了......也许我正在失去理智。
感谢您对此问题的所有质量反馈。我当然学会了一些新的故障排除技术,因此我非常感激。 :)
快乐的编码, 克里夫