[window form]使用SQLite + Entity framework

[window form]使用SQLite + Entity framework

紀錄一下過程

問題描述

客戶端軟體採用SQLite當作資料庫,有關資料庫的存取都藉由自行開發的函式使用;打算簡化現行存取方式,使得開發更直覺。

問題分析

原先打算使用sql server 2012 LocalDB當作資料庫,實作後發現有下列問題後,放棄使用:

1. Windows xp不支援。

2. 要安裝的套件太多,客戶端不一定可以安裝:

除了framework4.0,仍需安裝下列套件

Microsoft .NET Framework 4 的更新 4.0.2 – 執行階段更新 (KB2544514)

http://www.microsoft.com/zh-tw/download/details.aspx?id=27756

SqlLocalDB

http://www.microsoft.com/betaexperience/pd/SQLEXPCTAV2/zhtw/

3. 安裝資料夾權限問題:安裝路徑如果在系統資料夾,更新資料會出現錯誤

image001

要修改資料庫檔案安全性,加入寫入權限

image002

image003

最後決定開發方式採用SQLite+Entity framework。

目的

先建立雛形,並評估修改幅度及相關後續問題。

解決方法

先建立雛形,建立方式如下:

1. 先準備好測試的專案及資料庫檔案如下:

image004

2. 新增「實體資料模型」

image005

3. 從資料庫產生

image007

4. 新增連接

image009

5. 設定連線的相關資訊

image011

6. 下一步

image012

7. 選擇要加入的物件及命名空間後按「完成」

image014

8. 可以看到建立完成的資料庫模型

image016

9. 設計測試的畫面

image017

10. 輸入相關的測試程式碼

using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Configuration;
using model = NewPCD;

namespace NewPCD
{
    public partial class Form1 : Form
    {
        NewMediaEntities entity = new NewMediaEntities();
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            RefreshData();
        }

        /// <summary>
        /// Refreshes the data.
        /// </summary>
        private void RefreshData()
        {
            var a = from n in entity.test
                    select new { n.id, n.content, n.date };
            dataGridView1.DataSource = a;            
        }

        /// <summary>
        /// 新增.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
        private void btn_add_Click(object sender, EventArgs e)
        {
            model.test a = new model.test();
            a.content = "測試資料" + DateTime.Now.ToString("r");
            a.date = DateTime.Now;
            entity.AddTotest(a);
            entity.SaveChanges();
            RefreshData();
        }

        /// <summary>
        /// 刪除.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
        private void btn_Delete_Click(object sender, EventArgs e)
        {            
            int id = Convert.ToInt32(txt_DelId.Text.Trim());
            model.test delid = entity.test.Where(p => p.id == id).SingleOrDefault();
            entity.DeleteObject(delid);
            entity.SaveChanges();
            RefreshData();
        }

        /// <summary>
        /// 修改.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
        private void btn_Modify_Click(object sender, EventArgs e)
        {
            int id = Convert.ToInt32(txt_ModifyId.Text.Trim());
            model.test Modifyid = entity.test.Where(p => p.id == id).SingleOrDefault();
            Modifyid.content = txt_ModifyContent.Text.Trim();
            Modifyid.date = DateTime.Now;
            entity.SaveChanges();
            RefreshData();
        }
        


    }

}

11. 測試完成OK!

image019

注意事項

1. 可以更新資料庫模型,參照下列畫面

image021

2. 如果客戶端不能灌SQLite Data Provider for .NET,參照下列網址說明:

    SQLite部署-找不到Provider解決方法

    需要注意DLL檔案的版本

pic1

3. SQLite的管理工具建議使用下面這套:

    SQLiteStudio

參考資料

SQLite部署-找不到Provider解決方法

[Entity Framework] SQLite 與 Entity Framework