我从.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";
我多次检查过表名和列名是否正确。我能看到的唯一区别是数据类型:
因此,我在代码中没有做的事情是否与LONG有关?
另外,CLI_CLIENTNUMBER实际上是一个VARCHAR2,为什么我不需要语句中00404左右的单撇号,而对于RI_CODE这是VARCHAR2我(显然)需要围绕'GAIL'的撇号(否则我得到一个无效的标识符异常?
**编辑
该语句在SQL Plus上运行良好
**编辑 - 解决方案
根据答案中的链接,技巧是将OracleCommand对象InitialLONGGetchSize设置为-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