即使我使用 splitOn 参数后仍然出现异常

Posted

技术标签:

【中文标题】即使我使用 splitOn 参数后仍然出现异常【英文标题】:Still getting the exception even after I use splitOn param 【发布时间】:2017-04-27 15:48:12 【问题描述】:

我有引用 2 个对象位置和类别的事件类。

我编写了我的 SQL 查询字符串,它工作正常,但是当我将查询放入 dapper ORM.VS 时告诉我我有一个内部异常。即使使用 splitOn 参数,我仍然会收到异常。

注意:我们使用 RecordID 作为 col 的 name 键 col 用于下表 Event、EventLocation 和 EventCategory。那是问题吗?

System.ArgumentException 发生 HResult=0x80070057 消息=当 如果您使用多映射 API,请确保您设置 splitOn 参数 拥有除 Id 以外的键

      public IEnumerable<Event> SelectEventsForList()
        
            // using (var db = new )

            var queryStr = @"SELECT 
                            e.RecordID
                            ,e.Title
                            ,e.Description [Description]
                            ,e.Location  [LocationDetails]
                            ,e.RegistrationRequired AS [IsRegistrationRequired]
                            ,e.StartDate AS [EventDate]
                            ,e.StartDate
                            ,e.EndDate
                            ,e.MaximumRegistrants
                            ,eloc.RecordID
                            ,eloc.DisplayName
                            ,eloc.DisplayColour
                            ,ecat.RecordID
                            ,eCat.DisplayName
                            ,eCat.DisplayColour
                            FROM dbo.Event e INNER JOIN dbo.EventLocation eloc ON e.LocationId = eloc.RecordID
                            INNER JOIN dbo.EventCategory eCat ON e.CategoryID = ecat.RecordID
                            WHERE eCat.Deleted = 0";

            return this.dbConnection.Query<Event, Location, Category, Event>(
queryStr, (e, l, c) =>  
e.Location = l; e.Category = c; return e; 
,splitOn: "eloc.RecordID,ecat.RecordID");
        

【问题讨论】:

你试过只用 eloc.RecordID,ecat.RecordID 吗?其他 id 不参与您的映射 另外,最好指定所有字段的名称,而不是使用 * 我删除 * 并使查询变得冗长,将查询拆分为 Event |位置 |类别,我刚刚使用 eloc.RecordID,ecat.RecordID 仍然得到同样的错误。 :( .我看到更新的代码 我的代码中有一个示例,我不添加表说明符,而只添加字段名称。 IE:RecordID 不确定是否需要两次。 您可以在这些答案中找到一些亮点:***.com/questions/7472088/… 和 ***.com/questions/17168926/… 【参考方案1】:

如果在select子句中写入表名.列名,结果集中的列名将不包含表名。例如:

select eloc.RecordId 
from dbo.EventLocation eloc

返回的列名将是RecordId

所以你应该使用 splitOn:"RecordId,RecordId"。

Dapper 向后查看结果集中的列,因此它应该找到查询返回的第二和第三个 RecordId 列。

【讨论】:

以上是关于即使我使用 splitOn 参数后仍然出现异常的主要内容,如果未能解决你的问题,请参考以下文章

Dapper Orm 删除异常

MFC应用程序关闭后异常中断

即使代码在try / catch块中,我仍然会收到异常[关闭]

SqlConnection() 无参数异常

上传文件时 Laravel 6.0 出现“SplFileInfo::getSize(): stat failed”异常

即使在授予存储权限后权限也被拒绝