未从数据库检索到Oracle SQL语句LONG



我正在从.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);
}

现在,我无法让这个语句返回任何内容-assert失败,result=";

但是,我可以得到这个声明来返回预期:

string sql = "SELECT CLI_ABBRNAME 
                FROM CLI_CLIENT 
               WHERE CLI_CLIENTNUMBER = 00404";

我已经检查了很多次表名和列名是否正确。我能看到的唯一区别是数据类型:

  • RI_DESCRIPTION为LONG
  • RI_CODE是VARCHAR2
  • CLI_CLIENTNUMBER是VARCHAR2
  • CLI_ABBRNAME是VARCHAR2

因此,是否有什么与我在代码中没有做的LONG有关的事情?

此外,CLI_CLIENTNUMBER实际上是一个VARCHAR2,为什么我不需要语句中00404附近的单撇号,而对于RI_CODE,即VARCHAR 2,我确实(显然)需要"GAIL"周围的撇号(否则我会得到无效标识符异常?

**编辑

该语句在SQL Plus 上运行良好

**编辑-解决方案

按照答案中的链接,诀窍是将OracleCommand对象InitialLONGGetchSize设置为-1。

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

如果您使用的是ODP.NET,我在"获取LONG和LONG原始数据"中找到了这一点。看起来参数InitialLONGFetchSize最初设置为0,您需要增加它来检索LONG。

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

SELECT CLI_ABBRNAME 
  FROM CLI_CLIENT 
 WHERE TO_NUMBER(CLI_CLIENTNUMBER) = 404

最新更新