相关文章推荐
风流倜傥的蛋挞  ·  node.js - Error in ...·  1 年前    · 
善良的小蝌蚪  ·  获取错误: /bin/sh ...·  1 年前    · 
冷冷的牛肉面  ·  TCR-Pred: A new ...·  1 年前    · 
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) //待补充... // PRAGMA table_info('tablename') /// <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 {_tablename} ADD COLUMN {fieldName} {fieldtype}" 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, 依赖于sqlite3.dll文件,分x86或x64, 下载地址

一, 写好一个数据模型类, 类名随意

publilc class ModelName{
    [PrimaryKey, Autoincrement]
    public int id = 0;
    public string name { set; get; }
    public int age { set; get; }}

二,在写一个数据模型操作的类,类名与数据模型类名一似,以便区分

// 继承了基本类,接口
public class ModeNameDal : Dal<ModeName>, DalAdapter<ModeName>
    // 构造方法中初始化
    public ModeName()
        // 调用父类中的初始化方法
        init(this);
    // 接下来就是由VS自动生成实现接口的方法了
    // 还可以调用父类已定义好的操作模型数据方法
    // 相信,如果你看懂怎么用, 那这样就不错了...

三, 接下来就可以创建和操作数据库模型

var dal = new ModeNameDal();
var info = dal.QueryInfo(0); // 查询一条记录
if (info != null) // info 模型
// ...
var list = dal.QueryListAll(); // 查询所有
复制代码
分类:
后端
标签: