我目前使用的Oracle管理驅動程序(v12.1.2400)字符集不匹配,並在執行過程中我目前看到ORA-12704: character set mismatch
錯誤。ODP.Net管理驅動程序 - ORA-12704:作爲我的實體框架的驅動程序生成的代碼
的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''
。 AS德列不是unicode的,如果我去掉前面N
只留下''
那麼SQL按預期工作。
有沒有什麼辦法可以防止這種違約?
所有db列當前都是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驅動程序中的一個錯誤。
有同樣的問題..你曾經找到一個合理的解決方案嗎? – solidau
將解決方案作爲解答添加到我的解決方案中 – Nick