今天發生一件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輸出控制台,但多次測試下,控制台畫面一片祥和~~
在呼叫SavePost方法的時候,沒有使用await
,一種射後不理的概念。
加上await
後,再次運行程式,可以在控制台看到Fail
Exception錯誤訊息。