网站策划书格式,大兴网站开发网站建设,杭州企业网站设计好公司,查域名ip地址查询在工控领域#xff0c;经常遇到断电关机数据库文件损坏的情况#xff0c;SQLite如此#xff0c;LiteDb也是这样。ZTO有数万自动化扫描设备#xff0c;每天都有数百台设备因断电数据库损坏等原因#xff0c;而不得不重装软件。因此#xff0c;设计了CsvDb#xff0c;用于… 在工控领域经常遇到断电关机数据库文件损坏的情况SQLite如此LiteDb也是这样。ZTO有数万自动化扫描设备每天都有数百台设备因断电数据库损坏等原因而不得不重装软件。因此设计了CsvDb用于本地保存少量数据一般只有几百几千行极限不超过十万行。Nuget包NewLife.Core源码地址https://github.com/NewLifeX/X/blob/master/NewLife.Core/IO/CsvDb.cs插入数据Add插入一个对象一行数据到末尾。var db new CsvDbGeoArea((x, y) x.Code y.Code)
{FileName data/db.csv
};
var model new GeoArea
{Code Rand.Next(),Name Rand.NextString(14),
};
db.Add(model);// 把文件读出来
var lines File.ReadAllLines(db.FileName.GetFullPath());
Assert.Equal(2, lines.Length);
实例化CsvDb时需要指定模型类它决定数据格式。构造函数中还可以指定比较器可以理解为主键字段用于查找目标数据行。跑起来效果是这样查找数据Find 用于查找一个对象本质上引擎内部会遍历所有数据行逐行对比主键。var db new CsvDbGeoArea((x, y) x.Code y.Code)
{FileName data/db.csv
};
var model db.Find(new GeoArea { Code 1234 });
此外还可以使用 FindAll 查找多行满足条件的数据指定委托。public IListT FindAll();
IListT FindAll(FuncT, Boolean predicate, Int32 count -1);
Int32 FindCount();
更新数据Update 用于更新一个对象本质上读取所有数据进入内存修改对应数据后再写回去成本较高在数据量不大小于1万时问题不大。var db new CsvDbGeoArea((x, y) x.Code y.Code)
{FileName data/db.csv
};
var model new GeoArea
{Code 1234,Name Stone,
};
db.Update(model);
删除数据Remove 用于删除满足条件的对象本质上读取所有数据进入内存删除满足条件的对象后写回去成本较高。如果删除后没有剩余数据行则直接删除文件。Int32 Remove(T model);
Int32 Remove(IEnumerableT models);
Int32 Remove(FuncT, Boolean predicate);
总结数万工控设备多年实践表明Csv数据库很靠谱在断电关机的时候csv文件同样也会损坏只不过是CsvDb读取时跳过无法解析的错误行避免了应用崩溃。