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