你能说出为啥 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实现简单仓储

将 DapperExtensions 用于“GetList”时引发异常

关于Java的拷贝你能说出个123么?

144期考考基础部分,你能说出 TreeMap 原理实现及常用方法吗?

面试高频题:springboot自动装配的原理你能说出来吗?

面试高频题:springBoot自动装配的原理你能说出来吗?