带有 Firebird 的实体框架引发动态 SQL 错误

Posted

技术标签:

【中文标题】带有 Firebird 的实体框架引发动态 SQL 错误【英文标题】:Entity framework with Firebird throws dynamic SQL error 【发布时间】:2015-02-21 14:29:43 【问题描述】:

我遇到了 FbException

SQL 错误代码 = -104

令牌未知 - 第 2 行,第 4 列

.

尝试运行此代码时

var result = from x in _context.Bunts
                         select x;

我检查了 EF 生成的查询

SELECT 
"A"."BUNTCODE" AS "BUNTCODE", 
"A"."BUNTNAME" AS "BUNTNAME", 
"A"."BUNTDIAM" AS "BUNTDIAM"
FROM "BUNTS" AS "A"

所以服务器认为“A”语句后的点有问题。但是这个查询在同一台机器上的 IBExpert 中运行得很好。如何解决这个问题?

我正在使用:

火鸟服务器 v2.1.6.18547

EntityFramework v6.0.0.0

EntityFramework.Firebird v4.5.2.0

FirebirdSql.Data.FirebirdClient 4.5.2.0

【问题讨论】:

你的数据库是什么方言?你的连接方言是什么?该错误似乎表明您正在使用方言 1 进行连接(您不能引用对象名称,而双引号中的内容是字符串)。 非常感谢,马克!切换到方言 3 解决了我的问题! 我希望 Firebird 核心开发人员最终会杀死方言 1(和 2);方言 3 是 15 年前推出的... 【参考方案1】:

该错误表明您正在使用方言 1 进行连接。方言 1 是 Interbase 5 及更早版本的旧方言,应被视为已弃用(尽管不幸的是,15 年后 Firebird 仍然支持它......)。

在方言 1 中,不能引用对象名称,并且双引号用于字符串(而不是方言 3 和 SQL 标准中的单引号)。当您的查询以方言 1 进行解析时,Firebird 将 "A" 视为字符串常量,解析器不希望出现以下点 (.)。

切换到方言 3 应该可以解决此问题,但如果您这样做,请确保您的数据库本身也是方言 3,否则您可能会遇到其他意外行为,例如某些数据类型不起作用或错误等。

【讨论】:

以上是关于带有 Firebird 的实体框架引发动态 SQL 错误的主要内容,如果未能解决你的问题,请参考以下文章

实体框架仅在单个文件中发布时引发错误

Firebird 2.5 SQL 查询执行计划不使用带有 OR 语句的索引

实体框架核心 1.1.1 为连接字符串引发 ArgumentNullException

使用带有实体框架的动态字段按子记录排序

动态 SQL 到 LINQ 实体框架

Firebird 的 blob 大小是不是只有 32kb?