【发布时间】:2012-02-27 10:43:34
【问题描述】:
我正在从 .NET 应用程序访问 Oracle 数据库。我的代码结构如下:
using (OracleConnection conn = new OracleConnection(Oradb))
{
conn.Open();
string sql = "SELECT RI_DESCRIPTION
FROM RI_RISK
WHERE RI_CODE = 'GAIL'";
OracleCommand cmd = new OracleCommand(sql, conn);
cmd.CommandType = CommandType.Text;
OracleDataReader dr = cmd.ExecuteReader();
dr.Read();
var result = dr.GetString(0);
Assert.AreEqual("Golden Arches Insurance", result);
}
现在,我无法让此语句返回任何内容 - 断言失败,结果 = "";
但是,我可以让这个语句返回预期的结果:
string sql = "SELECT CLI_ABBRNAME
FROM CLI_CLIENT
WHERE CLI_CLIENTNUMBER = 00404";
我已多次检查表和列名是否正确。我能看到的唯一区别是数据类型:
- RI_DESCRIPTION 很长
- RI_CODE 是 VARCHAR2
- CLI_CLIENTNUMBER 是 VARCHAR2
- CLI_ABBRNAME 是 VARHCHAR2
因此,我在代码中没有做的 LONG 有什么需要做的吗?
此外,CLI_CLIENTNUMBER 确实是一个 VARCHAR2,为什么我不需要在语句中的 00404 附近使用单个撇号,而对于 RI_CODE,它是 VARCHAR2,我确实(显然)需要在 'GAIL' 周围使用撇号(否则我会得到一个 Invalid Identifier 异常?
** 编辑
该语句在 SQL Plus 上运行良好
** 编辑 - 解决方案
按照答案中的链接,诀窍是将 OracleCommand 对象 InitialLONGGetchSize 设置为 -1。
【问题讨论】:
-
数据库看起来一团糟:描述不应该是数字(LONG),数字(LONG)不能是“Golden Arches Insurance”。
-
直接对数据库运行 sql(而不是从您的应用程序) - 验证您是否获得了预期的结果