Saya mencoba menanyakan dengan Dapper tabel Sqlite yang terlihat seperti ini:

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
)

Saat ini di tabel itu saya hanya mendapat satu catatan:

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();

    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 terlihat seperti ini:

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; }

}

Saya mendapatkan System.Data.DataException dengan pesan Error parsing column 1 (MachineName=System.Byte[] - Object).

Berikut adalah tumpukan panggilan:

   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

Dan pengecualian batin:

Message: Object must implement IConvertible.

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

Dapatkah seseorang membantu saya memahami mengapa saya harus menerapkan IConvertible pada model?

Saya mencoba mengimplementasikan IConvertible hanya untuk properti MachineName tetapi masih memunculkan pengecualian yang sama.

0
Mihaimyh 21 September 2019, 10:57

1 menjawab

Jawaban Terbaik

Dalam situasi khusus ini Object must implement IConvertible inner exception berarti bahwa Dapper tidak dapat secara otomatis mengonversi MachineName bidang DB Anda dari tipe DB BLOB ke tipe model string

Anda harus menggunakan tipe DB TEXT untuk kolom MachineName (yang seharusnya merupakan pilihan yang tepat) atau memasukkannya ke dalam SQL selectke TEXT dengan benar. Seperti ini:

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

Kedua opsi harus memperbaiki masalah Anda saat ini dengan pengecualian.

Untuk informasi lebih lanjut tentang casting ke TEXT, lihat di sini: Sqlite: How to cast(data sebagai TEXT) untuk BLOB

2
Oleksandr Tyshchenko 24 September 2019, 09:02