using SQLite;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DAL
{
// 用於實現操做模型數據類的接口
public interface DalAdapter<T>
{
T QueryInfo(SQLiteConnection db, string selectSql, params Object[] values);
List<T> QueryList(SQLiteConnection db, string selectSql, params Object[] values);
List<T> QueryList(SQLiteConnection db, string selectSql);
}
}
複製代碼
using Model;
using SQLite;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
namespace DAL
{
// 用於可被繼承操做數據模型類的基本類
public class Dal<T>
{
protected string _tablename = "tablename", _dbname = "";
private DalAdapter<T> __da;
public static Semaphore lockTask = new Semaphore(1, 1);
/// <summary>
/// 表在的數據庫文件名
/// </summary>
/// <param name="dbName"></param>
public Dal(string dbName=null)
{
if (string.IsNullOrEmpty(dbName)) dbName = DbFactory.default_db_path;
_tablename = typeof(T).Name;
_dbname = dbName;
}
/// <summary>
/// 繼承基類的,派生類構造方法必須執行初始化 Init(this);
/// </summary>
/// <param name="da"></param>
public void Init(DalAdapter<T> da)
{
__da = da;
}
/// <summary>
/// 建立表
/// </summary>
/// <param name="isClear">默認清空已存在的表記錄</param>
/// <returns></returns>
public bool CreateTable(bool isClear = true)
{
using (var db = GetDb())
{
int c = db.CreateTable<T>();
if (isClear && c == 0)
{
db.DeleteAll<T>();
return true;
}
return true;
}
}
/// <summary>
/// 從一個模型類中獲取字段
/// </summary>
/// <param name="model"></param>
//public Dictionary<string, string> GetTableFiledAllFormModel(T model)
//{
//待補充...
//}
/// <summary>
/// 升級表處理
/// </summary>
/// <param name="fields">判斷和增長的字段 key字段名,value數據類型</param>
public void UpgradeTable(Dictionary<string,string> fields)
{
// 判斷和增長的字段,就是列出列名,而後判斷是否增長.或者修改.
string selectSql = $"pragma table_info({_tablename})";//列名錶是空的
using (var db = GetDb())
{
var list = db.Query<table_info>(selectSql);
if (list.Count > 0)
{
foreach (var field in fields)
{
if (!list.Exists(p => p.name == field.Key))
//if (db.Execute($"select COUNT(*) from information_schema.columns WHERE table_name = '{_tablename}' and column_name = '{field.Key}'")>1)
{
//$"ALTER TABLE {_dbname} ADD COLUMN orders_assue_num integer"
db.Execute($"ALTER TABLE {_tablename} ADD COLUMN {field.Key} {field.Value}");
}
}
}
}
}
// 插入一條數據模型
public bool InsertInfo(T info)
{
using(var db = GetDb())
{
return db.Insert(info) > 0;
}
}
// 刪除一條數據模型, id 是有 primary_key
public bool DeleteInfo(int id)
{
using(var db = GetDb())
{
return db.Delete<T>(id) > 0;
}
}
// 更新一條記錄, 記得 id 主鍵
public bool UpdateInfo(T info)
{
using(var db = GetDb())
{
return db.Update(info) > 0;
}
}
// 查詢一條記錄, 須要一個 id
public T QueryInfo(int id)
{
using (var db = GetDb())
{
return __da.QueryInfo(db, $"select * from {_tablename} where id=?", id);
}
}
// 查詢一條記錄,有條件的, whereSql 是查詢where後的語句, values是傳?對應的條件條件值
public T QueryInfoFromWhere(string whereSql, params Object[] values)
{
using(var db = GetDb())
{
return __da.QueryInfo(db, $"select * from {_tablename} where "+whereSql+" limit 1", values);
}
}
// 查詢多條記錄,有條件的,查詢方式同上
public List<T> QueryListFromWhere(string whereSql, params Object[] values)
{
using(var db = GetDb())
{
return __da.QueryList(db, $"select * from {_tablename} where " + whereSql, values);
}
}
// 默認查全部記錄
public List<T> QueryListAll()
{
using(var db = GetDb())
{
return __da.QueryList(db, $"select * from {_tablename}");
}
}
// 刪除多條記錄, 只刪ids對應的
public bool DeleteInfoes(List<int> ids)
{
string idsStr = string.Join(",", (from f in ids select f));
using (var db = GetDb())
{
return db.Execute($"delete from {_tablename} where id in (?)", idsStr) > 0;
}
}
// 刪除全部記錄
public bool DeleteListAll()
{
using(var db = GetDb())
{
return db.DeleteAll<T>()>0;
}
}
// 更新多條記錄,注意id主鍵
public bool UpdateInfoes(List<T> infoes)
{
using (var db = GetDb())
{
return db.UpdateAll(infoes)>0;
}
}
// 鏈接數據庫用的,不用管
public SQLiteConnection GetDb()
{
string dbPath = DbFactory.getAppDataPath(_dbname);
lockTask.WaitOne();
return new SQLiteConnection(dbPath, new Action(() => { lockTask.Release(); }));
}
}
}
複製代碼
綜上所述,基本實現例子以下:數據庫
數據庫是SQLite,bash
一, 寫好一個數據模型類, 類名隨意ui
publilc class ModelName{
[PrimaryKey, Autoincrement] public int id = 0;
public string name { set; get; }
public int age { set; get; }}複製代碼
二,在寫一個數據模型操做的類,類名與數據模型類名一似,以便區分this
// 繼承了基本類,接口
public class ModeNameDal : Dal<ModeName>, DalAdapter<ModeName>
{
// 構造方法中初始化
public ModeName()
{
// 調用父類中的初始化方法
init(this);
}
// 接下來就是由VS自動生成實現接口的方法了
// 還能夠調用父類已定義好的操做模型數據方法
// 相信,若是你看懂怎麼用, 那這樣就不錯了...
}複製代碼
三, 接下來就能夠建立和操做數據庫模型spa
var dal = new ModeNameDal();
var info = dal.QueryInfo(0); // 查詢一條記錄
if (info != null) // info 模型
// ...
var list = dal.QueryListAll(); // 查詢全部複製代碼