iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 22
1
Modern Web

輕量高效.NET Core開源Blog引擎:Miniblog.Core系列 第 22

22.犯了低級錯誤,沒有處理非同步方法

今天發生一件Dapper使用SQLite怪事:
1.呼叫Delete不執行後面代碼,直接return離開方法
2.並且沒有呼叫complete資料也成功更新到DB

舉例
我在執行保存文章SavePost方法,運行Delete Categories where PostID = @ID ;直接return離開方法,後面重新整理快取都沒有執行導致異常。
sdsad

public override async Task SavePost(Post post)
{
    using (var conn = SQLiteHelper.CreateDefaultConnection())
    using (var ts = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
    {
    	//..略
        var cats = post.Categories.Select(s => new { PostID = post.ID, Name = s }).ToList();
        await conn.ExecuteAsync(@"
            Delete Categories where PostID = @ID ;
        ", post);
        await conn.ExecuteAsync(@"
            INSERT INTO Categories (PostID ,Name) 
            VALUES (@PostID ,@Name)
        ", cats);
        //..略
        ts.Complete();
    }

	/*整理快取*/
    if (!_cache.Contains(post))
    {
        _cache.Add(post);
        SortCache();
    }
    ReloadCacheData();
}

發現原因,犯了兩個低級錯誤:
1.SQL Server用慣了delete table where 條件,忘記還有delete from table where 條件用法。導致使用delete指令的時候發生SQLiteException SQL logic errornear "Categories": syntax error

2.沒有使用await讓非同步方法射後不理
正常應該要拋出Exception輸出控制台,但多次測試下,控制台畫面一片祥和~~
2018-10-23.09.34.06-image.png

在呼叫SavePost方法的時候,沒有使用await,一種射後不理的概念。
2018-10-23.09.36.23-image.png

加上await後,再次運行程式,可以在控制台看到Fail Exception錯誤訊息。
2018-10-23.09.33.04-image.png


上一篇
21.研究PWA漸進式增強Web APP(下) : 為甚麼要使用PWA、本機安裝
下一篇
23.使用SQLite推上雲端發生意外
系列文
輕量高效.NET Core開源Blog引擎:Miniblog.Core30

尚未有邦友留言

立即登入留言