2018-09-15

[ASP.NET] 第一次使用 SQLite

  公司很多程式的 Log 因為寫入太頻繁怕影響到 DB Server 的效能而寫成 TXT 文字檔,但是在閱讀上很不方便,而且無法像 SQL 一樣多條件查詢出想找的 Log。 

  基於以上原因,開始研究也是屬於檔案型態的 SQLite,它的寫法跟 ADO.NET 很像,所以很好上手,而此次目的很簡單,只是想將寫 Log 的方式改變一下而已,所以沒有深入研究,以下只是入門款的記錄。

先使用 NuGet 安裝 System.Data.SQLite.Core。

請注意寫日期到 Log 時的方式:
using (SQLiteConnection conn = new SQLiteConnection())
{
    // 指定SQLite檔案的路徑和檔名
    conn.ConnectionString = "data source=D:\\Log\\Log.sqlite";
    conn.Open();

    // Create Table
    SQLiteCommand cmd = conn.CreateCommand();
    cmd.CommandText = @"Create Table Log (
                                           LogID        INTEGER PRIMARY KEY,
                                           Message      TEXT,
                                           CreateDate   DATETIME
                                          )";
    cmd.ExecuteNonQuery();

    // 寫Log。
    // 使用SQLite內建的datetime('now')時,需加8小時(480分)才會是台灣時間
    cmd.CommandText = @"Insert into Log (Message,CreateDate) values (@Message, datetime('now', '+480 minutes'))";
    cmd.Parameters.Clear();
    cmd.Parameters.Add(new SQLiteParameter("Message", strMessage));
    cmd.ExecuteNonQuery();

    // 寫Log,
    // 使用C#的DateTime.Now時,一定要使用SQLite Parameter,如果用字串相加的方式,Insert時不會有問題,但Select時就會因日期格式不符而讀取失敗
    cmd.CommandText = @"Insert into Log (Message,CreateDate) values (@Message, @Now)";
    cmd.Parameters.Clear();
    cmd.Parameters.Add(new SQLiteParameter("Message", strMessage));
    cmd.Parameters.Add(new SQLiteParameter("Now", DateTime.Now)); // 這裡不用再加8小時,雖然存入會少8小時,但C#讀出時會自動加8小時
    cmd.ExecuteNonQuery();
}

可以安裝 DB Browser for SQLite 來開啟 SQLite 檔案觀看內容。
已經將SQLite常用語法打包成 SQLiteLib,用法跟 DBLib 一樣,需要者請自行取用。


參考來源:Log有訊,Bug無邊黑暗執行緒

沒有留言:

張貼留言