加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长百科 > 正文

string – Entity Frameworkamp;Oracle:无法插入VARCHAR2gt

发布时间:2021-01-19 05:43:17 所属栏目:站长百科 来源:网络整理
导读:我在Oracle表中创建了一个4,000个字符的VARCHAR2字段.我使用带有Visual Studio 2010,.NET Framework 4和 ODAC 11.2 Release 4 and Oracle Developer Tools for Visual Studio (11.2.0.3.0)的LINQ to Entities将字符串值插入到字段中.当我尝试插入大于1,999个

我在Oracle表中创建了一个4,000个字符的VARCHAR2字段.我使用带有Visual Studio 2010,.NET Framework 4和 ODAC 11.2 Release 4 and Oracle Developer Tools for Visual Studio (11.2.0.3.0)的LINQ to Entities将字符串值插入到字段中.当我尝试插入大于1,999个字符的字符串值时,我得到以下内部异常:

Oracle.DataAccess.Client.OracleException

ORA-00932: inconsistent datatypes: expected – got NCLOB

但是,我可以使用SQL Developer在字段中插入4,000个字符的字符串值而不会出现任何问题.

有一个known ODAC bug(source #2),其中保存到XMLTYPE字段时有2,000个字符限制,但我没有保存到XMLTYPE字段.我在我的GAC中有Oracle.DataAccess 2.112.3.0,我考虑更新到上述Oracle软件的第5版(11.2.0.3.20),但是“Oracle Developer Tools for Visual Studio”是唯一一个似乎是从第4版更新,我相信“Oracle Data Provider for .NET 4”是需要更新的组件.在我的.NET项目中,System.Data.Entity和System.Data.OracleClient都是运行时版本4.0.30319.

无论如何,我只是想知道是否有其他人遇到过这个错误,如果有的话,如果找到了任何解决方案 – 除了上面链接的Oracle论坛帖子中的那个提议使用存储过程作为解决方法.谷歌告诉我,只有在使用XMLTYPE字段时,人们才会遇到此错误,但我不能成为唯一一个在使用VARCHAR2字段时遇到此错误的人,可以吗?

(FWIW,我也希望在上面链接的Oracle论坛帖子中收到用户“997340”的帖子回复.如果我收到有用的回复,我一定会在这方面分享知识.)

编辑:如果有帮助,下面是我的代码中失败的两个块.我在对第一个进行故障排除时创建了第二个块,只是为了查看是否存在任何差异.检查字符串值是否已插入(“if”语句)时,以及实际插入字符串值(“AddObject”语句)时,我得到异常.

1:

if (!(from q in db.MSG_LOG_MESSAGE where q.MESSAGE == msg select q.MESSAGE).Any())
{
  db.MSG_LOG_MESSAGE.AddObject(new MSG_LOG_MESSAGE { MESSAGE = msg });
  db.SaveChanges();
}

2:

if (!db.MSG_LOG_MESSAGE.Any(q => q.MESSAGE == msg))
{
  db.MSG_LOG_MESSAGE.AddObject(new MSG_LOG_MESSAGE { MESSAGE = msg });
  db.SaveChanges();
}

4月3日更新:

我能够从上面第一个代码块中的“if”语句跟踪发送到Oracle的SQL.这里是:

SELECT
CASE WHEN ( EXISTS (SELECT
        1 AS "C1"
        FROM "SEC"."MSG_LOG_MESSAGE" "Extent1"
        WHERE ("Extent1"."MESSAGE" = :p__linq__0)
)) THEN 1 WHEN ( NOT EXISTS (SELECT
        1 AS "C1"
        FROM "SEC"."MSG_LOG_MESSAGE" "Extent2"
        WHERE ("Extent2"."MESSAGE" = :p__linq__0)
)) THEN 0 END AS "C1"
FROM  ( SELECT 1 FROM DUAL ) "SingleRowTable1" ;

不幸的是,我使用的DBA没有向我提供“p_linq_0”参数的值,但如前所述,当它超过1,999个字符时,会发生异常. (当跟踪此SQL时,我传递了一个4,000个字符的字符串作为参数,当然发生了异常.)DBA还提到了某些SQL客户端 – 例如SQLPlus – 无法处理超过2,000个字符的VARCHAR2.我没有完全跟随.无论是使用SQLPlus,SQL Developer还是其他任何工具,Oracle仍然会查询4,000个字符的VARCHAR2字段.另外,我的幻数是1,999个字符;不是2,000个字符. DBA是否意味着参数中有多少个字符存在限制?更重要的是,当我在SQL Developer中执行此SQL并为参数输入一个4,000个字符的字符串时,它完美地运行.所以我仍然完全不知道为什么它不能通过LINQ to Entities工作.我还尝试在我的程序中使用以下代码在“msg”变量中运行类似的查询,其中包含4,000个字符的字符串,这也完美地起作用:

using Oracle.DataAccess;
using Oracle.DataAccess.Client;
using System.Data;

...

OracleConnection conn = new OracleConnection("Data Source=[MASKED];User Id=[MASKED];Password=[MASKED]");
conn.Open();
OracleCommand cmd = new OracleCommand();
cmd.Connection = conn;
cmd.CommandText = "SELECT message FROM msg_log_message WHERE message = '" + msg + "'";
cmd.CommandType = CommandType.Text;
OracleDataReader dr = cmd.ExecuteReader();
dr.Read();
string result1 = dr.GetString(0);
conn.Dispose();

就目前而言,我仍然指责ODAC是错误的,因为它与LINQ to Entities有关…

解决方法

最新的ODP.NET文档 – 从2012年9月开始的“11.2版本5生产(11.2.0.3.0)” – 在“实体框架相关提示,限制和已知问题”部分中说明了以下已知问题,该部分解决了问题代码块中的“if”语句:

An “ORA-00932 : inconsistent datatypes” error can be encountered if a string of 2,000 or more characters,or a byte array with 4,000 bytes or more in length,is bound in a WHERE clause of a LINQ/ESQL query. The same error can be encountered if an entity property that maps to a BLOB,CLOB,NCLOB,LONG,LONG RAW,XMLTYPE column is used in a WHERE clause of a LINQ/ESQL query.

较早的ODP.NET文档 – 从2011年5月开始的“版本11.2.0.3.0生产” – 陈述了同样的已知问题,所以显然这已经是一个已知的问题.

上述两个文档都没有提到问题代码块中的“AddObject”语句遇到相同的错误,但该问题与提到的XMLType字段的另一个已知问题非常相似:

An “ORA-00932: inconsistent datatypes: expected – got NCLOB” error will be encountered when trying to bind a string that is equal to or greater than 2,000 characters in length to an XMLType column or parameter. [Bug 12630958]

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读