Oracle SQL语句长时间未从DB中检索

时间:2012-02-26 23:58:30

标签: .net sql oracle

我从.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 failed,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'的撇号(否则我得到一个无效的标识符异常?

**编辑

该语句在SQL Plus上运行良好

**编辑 - 解决方案

根据答案中的链接,技巧是将OracleCommand对象InitialLONGGetchSize设置为-1。

1 个答案:

答案 0 :(得分:1)

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

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

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

SELECT CLI_ABBRNAME 
  FROM CLI_CLIENT 
 WHERE TO_NUMBER(CLI_CLIENTNUMBER) = 404