Вызов QueryAsync в Dapper вызывает исключение System.Data.DataException - PullRequest
0 голосов
/ 21 сентября 2019

Я пытаюсь запросить у Dapper таблицу Sqlite, которая выглядит следующим образом:

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<br> 1<br> 2019-09-21 03:04:10.099067<br> 2019-09-21 03:04:37.6825109 0<br> 4.0.0

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

    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 выглядит следующим образом:

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).

Вот стек вызовов:

   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

И внутреннее исключение:

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, но все равно выдает то же исключение.

1 Ответ

2 голосов
/ 21 сентября 2019

В этой конкретной ситуации Объект должен реализовывать IConvertible Внутреннее исключение означает, что Dapper не может автоматически преобразовать ваше поле MachineName БД из типа БД BLOB в тип модели string

Вы должны либо использовать тип БД TEXT для столбца MachineName (который, вероятно, является правильным выбором), либо правильно преобразовать его в SQL select в TEXT.Как это:

select cast(MachineName AS TEXT), IsOnline, TimesRan, LoginDateTime, LogoutDateTime, ForceUpgrade, Version from Running

Обе опции должны исправить вашу текущую проблему за исключением.

Подробнее о приведении к TEXT см. Здесь: Sqlite: Как выполнить приведение (данные в формате TEXT) для BLOB

...