[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. 安裝資料夾權限問題:安裝路徑如果在系統資料夾,更新資料會出現錯誤
要修改資料庫檔案安全性,加入寫入權限
最後決定開發方式採用SQLite+Entity framework。
目的
先建立雛形,並評估修改幅度及相關後續問題。
解決方法
先建立雛形,建立方式如下:
1. 先準備好測試的專案及資料庫檔案如下:
2. 新增「實體資料模型」
3. 從資料庫產生
4. 新增連接
5. 設定連線的相關資訊
6. 下一步
7. 選擇要加入的物件及命名空間後按「完成」
8. 可以看到建立完成的資料庫模型
9. 設計測試的畫面
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!
注意事項
1. 可以更新資料庫模型,參照下列畫面
2. 如果客戶端不能灌SQLite Data Provider for .NET,參照下列網址說明:
需要注意DLL檔案的版本
3. SQLite的管理工具建議使用下面這套:
參考資料