首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Oracle托管数据读取器为一个数据库表返回DBNull

Oracle托管数据读取器为一个数据库表返回DBNull
EN

Stack Overflow用户
提问于 2019-03-15 03:03:30
回答 1查看 166关注 0票数 1

问题:

我正在使用Oracle access client连接到Oracle数据库。当从一个表中选择一个值时,我会得到一个结果;当改变这个表时,我会得到一个空值。

背景:

在我的SQLDeveloper客户端中,我可以连接到数据库并运行以下查询:

代码语言:javascript
复制
SELECT MSIB.SEGMENT1 
FROM APPS.MTL_SYSTEM_ITEMS_B MSIB 
WHERE MSIB.ORGANIZATION_ID = 255 AND MSIB.SEGMENT1 = '03F.211';
-- 1 ROW RETURNED - VALUE OF 03F.211

SELECT MC.SEGMENT1 
FROM APPS.MTL_CATEGORIES_VL MC 
WHERE MC.SEGMENT1 = 'A0042I';
-- 1 ROW RETURNED - VALUE OF A0042I

然后,在C#中,我使用完全相同的凭据连接到数据库(所以这不应该是数据库权限问题)。

运行这段代码,我得到一个消息框,返回我所期望的: 03F.211

代码语言:javascript
复制
 OracleConnection oradbcon = new OracleConnection(strOracleConString);
 oradbcon.Open();
 strQuery = "SELECT MSIB.SEGMENT1 FROM APPS.MTL_SYSTEM_ITEMS_B MSIB WHERE MSIB.ORGANIZATION_ID = 255 AND MSIB.SEGMENT1 = " + ":ITEM_CODE";
 // strQuery = "SELECT MC.SEGMENT1 FROM APPS.MTL_CATEGORIES_VL MC WHERE MC.SEGMENT1 = " + ":ITEM_CODE";
 OracleCommand oradbcmd = new OracleCommand(strQuery, oradbcon);
 oradbcmd.CommandType = CommandType.Text;
 OracleParameter p_item_code = new OracleParameter();
 p_item_code.OracleDbType = OracleDbType.Varchar2;
 p_item_code.Value = "03F.211";
 // p_item_code.Value = "A0042I";
 oradbcmd.Parameters.Add(p_item_code);
 OracleDataReader oradbdr = oradbcmd.ExecuteReader();
 oradbdr.Read();
 strProductMinor = oradbdr.GetString(0).ToString();
 MessageBox.Show(strProductMinor);

但是在切换了这些注释行的情况下运行代码时,我得到了一个错误,指出数据库为空:

代码语言:javascript
复制
OracleConnection oradbcon = new OracleConnection(strOracleConString);
oradbcon.Open();
// strQuery = "SELECT MSIB.SEGMENT1 FROM APPS.MTL_SYSTEM_ITEMS_B MSIB WHERE MSIB.ORGANIZATION_ID = 255 AND MSIB.SEGMENT1 = " + ":ITEM_CODE";
strQuery = "SELECT MC.SEGMENT1 FROM APPS.MTL_CATEGORIES_VL MC WHERE MC.SEGMENT1 = " + ":ITEM_CODE";
OracleCommand oradbcmd = new OracleCommand(strQuery, oradbcon);
oradbcmd.CommandType = CommandType.Text;
OracleParameter p_item_code = new OracleParameter();
p_item_code.OracleDbType = OracleDbType.Varchar2;
// p_item_code.Value = "03F.211";
p_item_code.Value = "A0042I";
oradbcmd.Parameters.Add(p_item_code);
OracleDataReader oradbdr = oradbcmd.ExecuteReader();
oradbdr.Read();
strProductMinor = oradbdr.GetString(0).ToString();
MessageBox.Show(strProductMinor);

什么会导致一个查询返回结果而另一个查询不返回结果?

(最后-如果上面有什么是丑陋的,请原谅我对C#的无知。多年的甲骨文经验-第一个C#程序...:)

EN

回答 1

Stack Overflow用户

发布于 2019-03-15 03:37:31

问题出在语言上。

APPS.MTL_CATEGORIES_VL是一个在其定义中有另一个视图的视图: MTL_CATEGORIES_TL

以TL结尾的视图是“翻译语言”,这意味着它们只返回数据库会话语言的结果。

当我连接时,SQL Developer正在声明默认语言。.NET客户端不是。

我要么需要弄清楚如何声明一种语言,要么重写我的查询以使用没有语言的基表。

编辑:有人抱怨说,这不是一个实际的答案,而是一种解释。

以下是实际的代码,它是答案:

代码语言:javascript
复制
    try // Open Connection
    {
        oradbcon = new OracleConnection(yourConnectionStringHere);
        oradbcon.Open();
        OracleGlobalization orainfo = oradbcon.GetSessionInfo();
        orainfo.Language = "AMERICAN"; // Explicitly Set Language
        oradbcon.SetSessionInfo(orainfo);
    }
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55170225

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档