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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (30)

问题:

我使用Oracle托管数据访问客户端连接到Oracle eBS数据库。从一个表中选择一个值时,我得到一个结果; 更改表时,我得到一个空值。

背景:

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

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

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

但是运行带有这些注释行的代码我得到一个错误,表明数据库为null:

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

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

提问于
用户回答回答于

问题是语言。

APPS.MTL_CATEGORIES_VL是一个视图,其定义中包含另一个视图:MTL_CATEGORIES_TL

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

SQL Developer在连接时声明了一种默认语言。.NET客户端不是。

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

扫码关注云+社区

领取腾讯云代金券