zoukankan      html  css  js  c++  java
  • EntityFramework查询oracle数据库时报ora-12704: character set mismatch

    1、这段linq,执行期间报ora-12704:character set mismatch错误。

    1 var query = from m in ctx.MENU
    2     where (m.SUPER_MENU_ID ?? "") == (parentMenuId ?? "")
    3     orderby m.SORT_ID descending
    4     select new { m.SORT_ID };

    生成出来的sql如下:

     1 SELECT "Project1"."SORT_ID" AS "SORT_ID"
     2    FROM (
     3 
     4 SELECT "Extent1"."SORT_ID" AS "SORT_ID"
     5    FROM "BA"."MENU" "Extent1"
     6  WHERE ((CASE WHEN("Extent1"."SUPER_MENU_ID" IS NULL) THEN '' 
     7                     ELSE "Extent1"."SUPER_MENU_ID" END) =
     8         (CASE WHEN(&p__linq__0 IS NULL) THEN '' 
     9                     ELSE &p__linq__0 END))
    10 
    11 ) "Project1"
    12 ORDER BY "Project1"."SORT_ID" DESC

    但是这条sql单独放到plsql里跑是OK的。

    2、改成这样,让生成的sql去掉了里面的case when就OK了。

    1 parentMenuId = parentMenuId ?? "";
    2 var query = from m in ctx.MENU
    3       where m.SUPER_MENU_ID == parentMenuId
    4     orderby m.SORT_ID descending
    5       select new { m.SORT_ID };

    生成的sql如下:

    1 SELECT "Project1"."SORT_ID" AS "SORT_ID" FROM ( 
    2 
    3 SELECT "Extent1"."SORT_ID" AS "SORT_ID"
    4    FROM "BA"."MENU" "Extent1"
    5 WHERE ("Extent1"."SUPER_MENU_ID" = :p__linq__0)
    6 
    7 ) "Project1"
    8 ORDER BY "Project1"."SORT_ID" DESC

    3、目前的猜测是,ef生成出来的case when有问题,调整linq不生成case when即可。但奇怪的是,同样的sql在plsql里跑居然也是ok的,手工修改客户端的字符集也无法在plsql里重现这个问题,如下:

    修改注册表里,HKEY_LOCAL_MACHINESOFTWAREORACLEKEY_OraClient11g_home2NLS_LANG,在plsql里客户端使用不同于服务端的字符集,但无法生成同样的错误。

    修改前:

    NLS_LANG = SIMPLIFIED CHINESE_CHINA.ZHS16GBK
    Character Sets
    Character size: 2 byte(s)
    CharSetID: 852
    NCharSetID: 2000
    Unicode Support: True
    NLS_LANG: SIMPLIFIED CHINESE_CHINA.ZHS16GBK
    NLS_CHARACTERSET: ZHS16GBK
    NLS_NCHAR_CHARACTERSET: AL16UTF16

    修改后:

    NLS_LANG = SIMPLIFIED CHINESE_CHINA.AL32UTF8
    Character Sets
    Character size: 2 byte(s)
    CharSetID: 873
    NCharSetID: 2000
    Unicode Support: True
    NLS_LANG: SIMPLIFIED CHINESE_CHINA.AL32UTF8
    NLS_CHARACTERSET: ZHS16GBK
    NLS_NCHAR_CHARACTERSET: AL16UTF16

    4、updated on 2014.06.03,问题有了新的线索,下面这条linq仍然会报同样的错误:

    R1 == null ? string.Empty : R1.Emp_ID

    但把string.Empty改成""就OK,很怪:

    R1 == null ? "" : R1.Emp_ID

    5、这个问题只是暂时解决,仍然存疑中,待完善。主要参考这篇:

    ef4 part 8: database agnostic linq to entities


    作者:AlexanderYao
    出处:http://alexanderyao.cnblogs.com/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    经典面试题回答——学习Java基础的目的
    Woody的逻辑游戏--怎样换轮胎
    skype默认占用80和443port
    opencl+opencv实现sobel算法
    Rational 最新软件试用下载地址
    leetcode-20-Valid Parentheses
    JPA学习笔记(11)——使用二级缓存
    新浪微博授权登陆获取个人信息
    Ubuntu 12.04 64bit GCC交叉编译器制作 原创
    表单兼容类型设计
  • 原文地址:https://www.cnblogs.com/AlexanderYao/p/3571702.html
Copyright © 2011-2022 走看看