你能说出为啥 DapperExtensions 更新方法无法执行吗?
Posted
技术标签:
【中文标题】你能说出为啥 DapperExtensions 更新方法无法执行吗?【英文标题】:Can you tell why DapperExtension''s Update method is failing to execute?你能说出为什么 DapperExtensions 更新方法无法执行吗? 【发布时间】:2016-11-10 16:51:57 【问题描述】:我正在使用 SQLite、Dapper 和 DapperExtensions,所有这些都是通过 NuGet 提供的最新版本。
这是我的表的架构...
CREATE TABLE `LibraryInfo` (
`Id` INTEGER NOT NULL,
`Name` TEXT NOT NULL CHECK(length ( Name ) > 0),
`Description` TEXT,
`Version` TEXT NOT NULL CHECK(length ( Version ) > 0),
PRIMARY KEY(Id)
);
在其中我有一行包含以下数据
Id = "0" 名称 = “测试库” 描述 = “这是测试库” 版本 = "1.2.3.4"
这是我的那张桌子的 POCO...
public class LibraryInfo
public int Id get; set;
public string Name get; set;
public string Description get; set;
public string Version get; set;
这是我初始化 DapperExtensions 的方法(我的表是复数 除了 这个表)...
DapperExtensions.DapperExtensions.DefaultMapper = typeof(PluralizedAutoClassMapper<>);
public class LibraryInfoMapper : ClassMapper<LibraryInfo>
public LibraryInfoMapper()
Table(nameof(LibraryInfo));
AutoMap();
这是让我从数据库中读取 ID 为 0 的单行的代码...
var libraryInfo = connection.Get<LibraryInfo>(0);
效果很好。但是,这失败了……
libraryInfo.Description = "Test";
connection.Update(libraryInfo);
这是一个例外......
发生 System.Data.SQLite.SQLiteException 错误代码=1 H结果=-2147467259 Message=SQL 逻辑错误或缺少数据库 “.”附近:语法错误 源=System.Data.SQLite 堆栈跟踪: 在 System.Data.SQLite.SQLite3.Prepare(SQLiteConnection cnn,String strSql,SQLiteStatement previous,UInt32 timeoutMS,String& strRemain) 内部异常:
不知道为什么!试图弄清楚如何查看它正在生成什么 SQL,但我不知道该怎么做,甚至不知道它是否可能。
求救!!!
【问题讨论】:
【参考方案1】:问题是 DapperExtensions 中 SQL 生成的默认方言是 SqlServer,这意味着内部生成的 SQL 是使用 Sqlite 不支持的表别名创建的。在发出任何命令之前,您需要将 Dapper Extensions SQL 方言更改为 Sqlite:
DapperExtensions.DapperExtensions.SqlDialect = new DapperExtensions.Sql.SqliteDialect();
一旦更改,Dapper Extensions 将以 Sqlite 格式创建 SQL 命令。
【讨论】:
伙计,如果我能给你十个复选标记,我会的!我认识的没有一个使用这些的人知道如何处理这个问题。即使在这里也没有任何cmets。以为我将不得不放弃 DapperExtensions,但我将您的行添加到我的初始化中,现在它完全按预期工作。你,先生,摇滚! 虽然有一个额外的问题......是否可以查看 SQL Dx 生成的内容,以便您了解发生了什么?有没有什么机制可以用来说“嘿……如果我要执行这段代码,你会使用什么 SQL?”我正要开始撕毁他们的代码并添加大量的日志记录,如果没有的话。 只是在黑暗中拍摄,但是当您在调试模式下运行您的应用程序时,输出窗口中是否有一些东西?另请阅读:***.com/questions/18529965/…。我从 Nuget 获得 dapper,但从源代码获得 DapperExtensions,因此很容易调试 当您获取 Dapper Extensions 源代码时,您可以在调试代码时单步执行它。在其中,它确实从 SqlGenerator 类中组装了一个 SQL 字符串。就在您可以检查 SQL 的地方。 其他让我失望的事情 - 如果您使用更新的异步版本的扩展方法,您需要这样做:DapperAsyncExtensions.SqlDialect = new SqliteDialect();
以上是关于你能说出为啥 DapperExtensions 更新方法无法执行吗?的主要内容,如果未能解决你的问题,请参考以下文章
将 DapperExtensions 用于“GetList”时引发异常
144期考考基础部分,你能说出 TreeMap 原理实现及常用方法吗?