首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Dapper中调用QueryAsync抛出System.Data.DataException

在Dapper中调用QueryAsync抛出System.Data.DataException
EN

Stack Overflow用户
提问于 2019-09-21 07:57:06
回答 1查看 1.1K关注 0票数 0

我正在尝试使用Dapper查询一个Sqlite,它如下所示:

代码语言:javascript
运行
复制
CREATE TABLE "Running" (
    "Id"    INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
    "MachineName"   BLOB NOT NULL DEFAULT 'machine' UNIQUE,
    "IsOnline"  INTEGER DEFAULT 0,
    "TimesRan"  INTEGER DEFAULT 0,
    "LoginDateTime" TEXT,
    "LogoutDateTime"    TEXT,
    "ForceUpgrade"  INTEGER NOT NULL DEFAULT 0,
    "Version"   TEXT
)

目前我在那张桌子上只有一张唱片:

1 DESKTOP-KQT7CGC 0

1

2019-09-21 03:04:10.099067

2019-09-21 03:04:37.6825109 0

4.0.0

var data = await _globalConfig.Connection.GetStatusAsync();

代码语言:javascript
运行
复制
    public async Task<List<ApplicationInfoModel>> GetStatusAsync()
    {
        using (IDbConnection cnn = new SQLiteConnection(ConfigurationManager.GetLocalOrSharedConnectionString(), true))
        {
            var output = await cnn.QueryAsync<ApplicationInfoModel>("select * from Running", new DynamicParameters());

            return output.ToList();
        }
    }

ApplicationInfoModel看起来如下所示:

代码语言:javascript
运行
复制
public class ApplicationInfoModel
{
    public int Id { get; set; }

    public string MachineName { get; set; }

    public bool IsOnline { get; set; }

    public int TimesRan { get; set; }

    public DateTime LoginDateTime { get; set; } = DateTime.Now;

    public DateTime LogoutDateTime { get; set; }

    public bool ForceUpgrade { get; set; }

    public string Version { get; set; }

}

我得到了一个System.Data.DataException和消息Error parsing column 1 (MachineName=System.Byte[] - Object)

下面是调用堆栈:

代码语言:javascript
运行
复制
   at Dapper.SqlMapper.ThrowDataException(Exception ex, Int32 index, IDataReader reader, Object value) in C:\projects\dapper\Dapper\SqlMapper.cs:line 3633
   at Dapper.SqlMapper.<QueryAsync>d__33`1.MoveNext() in C:\projects\dapper\Dapper\SqlMapper.Async.cs:line 439
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
   at SdeHelper.Library.Main.DataAccess.SQLiteConnector.<GetStatusAsync>d__11.MoveNext() in G:\Users\mdumi\GitRepos\sdehelper\SdeHelper.Library.Main\DataAccess\SQLiteConnector.cs:line 154
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
   at SdeHelper.WpfUI.Framework.Helpers.ApplicationManager.<StartApplication>d__3.MoveNext() in G:\Users\mdumi\GitRepos\sdehelper\SdeHelper.WpfUI.Framework\Helpers\ApplicationManager.cs:line 39

而内在的例外:

代码语言:javascript
运行
复制
Message: Object must implement IConvertible.

   at System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider)
   at System.Convert.ChangeType(Object value, Type conversionType)

有人能帮我理解为什么我要在模型上实现IConvertible吗?

我试图只为IConvertible属性实现MachineName,但它仍然抛出相同的异常。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-21 08:45:06

在这种特定情况下,对象必须实现IConvertible内部异常,这意味着Dapper不能自动将MachineName DB字段从DB类型BLOB转换为string模型类型。

您应该为TEXT列使用DB类型的MachineName列(据推测这是正确的选择),或者将它正确地转换为TEXT。如下所示:

代码语言:javascript
运行
复制
select cast(MachineName AS TEXT), IsOnline, TimesRan, LoginDateTime, LogoutDateTime, ForceUpgrade, Version from Running

这两个选项都应该修复当前的异常问题。

有关强制转换文本的更多信息,请参见此处:Sqlite: How to cast(data as TEXT) for BLOB

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58038347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档