【问题标题】:Oracle SQL Statement LONG Not Retrieved From DBOracle SQL 语句 LONG 未从数据库中检索
【发布时间】: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(而不是从您的应用程序) - 验证您是否获得了预期的结果

标签: .net sql oracle


【解决方案1】:

第一,您不应该使用 LONG。您应该将此字段转换为 CLOB。 LONG 已弃用。

如果您使用的是 ODP.NET,我在 "Obtaining LONG and LONG RAW Data" 上找到了这个。看起来参数 InitialLONGFetchSize 最初设置为 0,您需要增加它来检索 LONG。

而且,从技术上讲,您确实需要引号,但由于您将列与数字进行比较,我认为存在隐式转换。你所做的相当于:

SELECT CLI_ABBRNAME 
  FROM CLI_CLIENT 
 WHERE TO_NUMBER(CLI_CLIENTNUMBER) = 404

【讨论】:

  • 解决了!非常感谢你的帮助,伙计。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-25
  • 2014-01-06
  • 2013-07-18
  • 2017-08-29
  • 1970-01-01
  • 1970-01-01
  • 2020-06-14
相关资源
最近更新 更多