gpt4 book ai didi

c# - ODP.Net 托管驱动程序 - ORA-12704 : character set mismatch in generated code

转载 作者:太空狗 更新时间:2023-10-29 23:13:40 25 4
gpt4 key购买 nike

我目前正在使用 Oracle Managed Driver (v12.1.2400) 作为我的 Entity Framework 驱动程序,并且在执行期间看到了 ORA-12704: character set mismatch 错误。

我使用的LINQ->SQL代码如下:

from c in CUSTOMER.AsNoTracking()
where c.ACCOUNT.Contains("DE")
&& c.DELETED == "N"
orderby (c.FORENAME + c.SURNAME)
select new { c.ACCOUNT, c.FORENAME, c.SURNAME})

这将创建以下 SQL:

SELECT "Project1"."C2" AS "C1",
"Project1"."ACCOUNT" AS "ACCOUNT",
"Project1"."FORENAME" AS "FORENAME",
"Project1"."SURNAME" AS "SURNAME"
FROM (
SELECT( (CASE WHEN ("Extent1"."FORENAME" IS NULL) THEN N''
ELSE "Extent1"."FORENAME" END)
||(CASE WHEN ("Extent1"."SURNAME" IS NULL) THEN N''
ELSE "Extent1"."SURNAME" END)) AS "C1",
"Extent1"."ACCOUNT" AS "ACCOUNT",
"Extent1"."FORENAME" AS "FORENAME",
"Extent1"."SURNAME" AS "SURNAME",
1 AS "C2"
FROM "TEST"."CUSTOMER" "Extent1"
WHERE (("Extent1"."ACCOUNT" LIKE '%DE%')
AND ('N' = "Extent1"."DELETED"))) "Project1"
ORDER BY "Project1"."C1" ASC;

当我调试该 SQL 时,我可以看到问题是 SQL 在 CASE 部分使用了 N''。由于列不是 unicode,如果我删除前面的 N 只留下 '' 那么 sql 将按预期工作。

有什么办法可以防止这种违约吗?

所有数据库列当前都是 VARCHAR,并且在 C# 中建模为 string
两列的代码优先映射如下:

this.Property(t => t.FORENAME).HasColumnName("FORENAME").IsUnicode(false).HasMaxLength(35);
this.Property(t => t.SURNAME).HasColumnName("SURNAME").IsUnicode(false).HasMaxLength(35);

我原以为 IsUnicode(false) 语句会解决这个问题。

仅供引用,这曾经在我使用 EF5 和非托管驱动程序时有效。
此外,Devart dotConnectForOracle 驱动程序没有这个问题,所以我认为这是 Oracle 驱动程序中的错误。

最佳答案

我从来没有找到合适的解决方案,但我确实找到了一个行之有效的解决方法。

我创建了一个实现 IDbCommandInterceptor 的拦截器类 NVarcharInterceptor,并覆盖了所有 ..Executing(..) 方法以包含以下内容代码:

if (command != null && !string.IsNullOrWhiteSpace(command.CommandText))
command.CommandText = command.CommandText.Replace("N''", "''");

这有效地从我的 DbContext 上执行的任何命令中删除了任何不需要的 NVarchar 引用。

为了添加拦截器,我在 DBConfiguration 类中添加了以下代码:

this.AddInterceptor(new NVarcharInterceptor());

关于c# - ODP.Net 托管驱动程序 - ORA-12704 : character set mismatch in generated code,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33693374/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com