//相对路径 - 推荐 //ORM建库功能说明:建议不要加目录ORM没办法创建文件夹,如果加目录需要手动建文件夹 public static string ConnectionString= @"DataSource=SqlSugar4xTest.sqlite"; //完整路径 //ORM建库功能说明:这种方式ORM可以创建文件夹 public static string ConnectionString= @"DataSource=c:\database\SqlSugar4xTest.sqlite"; //动态获取完整路径 Path.Combine(Environment.CurrentDirectory, "SampleDB.db") var db= new SqlSugarClient(new ConnectionConfig() { DbType = SqlSugar.DbType.Sqlite, ConnectionString = Config.ConnectionString, IsAutoCloseConnection = true });
NUGET安装
1. SQLitePCLRaw.bundle_e_sqlcipher2.0.4
2. 下面只装一个根据不同版本
SqlSugarCore (.net Core)
SqlSugarCore_NetCore2 (支持.Framework 4.7.2+)
string dbName = Path.Combine(Environment.CurrentDirectory, "SampleDB.db"); string connStr=new SqliteConnectionStringBuilder(){ DataSource= dbName, Mode=SqliteOpenMode.ReadWriteCreate ,Password ="admin" }.ToString();
性能优化:因为加密Open会很慢所以建议
使用:SqlsugarClient的单例+关闭自动释放 , 如果业务所有用到db全部用 Lock(db){ db.xxx;db.xxx; } 防止并发问题
因为SqlsugarClient不是线程安全对象所以加Lock防止并发(免费加密目前不适合高并发项目,只适单用户项目)
//正常情况下SqlsugarClient是不能单例的,因为Open比较耗时只能用一个实例,CRUD中用lock去保证线程安全 public static SqlsugarClient Db= new SqlsugarClient(new ConnectionConfig() { ConnectionString = connStr,//获取加密后的字符串 DbType = DbType.Sqlite,//数据库类型 IsAutoCloseConnection = flase//并闭自动释放 }, db=> { }); } //只Open一次下次就不要关了 XXX.Db.Open() //不要有Close操作一直用这个连接就和地 //如果有并发需要这么处理 lock(XXX.Db) { //CRUD写里面,如果没有并发就不需要加lock XXX.Db.Insertable(data).ExecuteCommand(); }
注意:不是加密不要这么用 ,这么用主要是解决免费加密Open慢的问题
当遇到Nuget安装System.Data.SQLite失败或者无法安装,或者一直报引用兼容错误不知道如何解决请使用 新人包
1、Nuget安装SqlSugar或者引用最新的SqlSugar.dll
2、解压下载文件包
3、System.Data.SQLite.dll 引用到项目
4、x86 x64 2个文件夹扔到bin下面的dll 同一目录
如果还不会安装的话可以拿这个DEMO跑了试试
1万并发在10秒的内的 随机时间内请求,也就是正常并发短时间每秒1000吞吐是可以的
var rand = new Random(); for (int i = 0; i < 10000; i++) { Task.Run(async () => { try { await Task.Delay(rand.Next(1, 10000));//模拟真实请求每秒均匀并发1000 await dbAuth.CopyNew()//Copynew保证线程安全 .Updateable<Order>() .SetColumns(o => o.Name == "2").Where(o => o.Id == 1).ExecuteCommandAsync(); } catch (Exception ex) { Console.WriteLine(ex.Message);//这儿打断点不出错就是OK的 } }); }
性能优化:如果并发在同一个方法里面,可以不使用CopyNew(),通过TaskWhenAll实现,看标题2
https://www.donet5.com/Home/Doc?typeId=2349
一般情况下不要使用,一般用于备份库或者移动库等
//.NET CORE Microsoft.Data.Sqlite.SqliteConnection.ClearAllPools(); Microsoft.Data.Sqlite.SqliteConnection.ClearPool((SqliteConnection)db.Ado.Connection); //.NET Framework SQLiteConnection.ClearAllPools();
也可以使用自带的备份库方法(不需要清空连接池)
db.DbMaintenance.BackupDataBase(null, "sql2014test222.db");
请升级:SqlSugarCore 5.1.4.108-preview23+
Sqlite因为是虚拟类型,使用默认值如果不当可能会有未知风险,比如时间格式错误就会引起查询不到时间等。
所以需要手动开启
SqlSugarClient db = new SqlSugarClient(new ConnectionConfig() { DbType = DbType.Sqlite, ConnectionString = Config.ConnectionString3, InitKeyType = InitKeyType.Attribute, IsAutoCloseConnection = true, MoreSettings=new ConnMoreSettings() { SqliteCodeFirstEnableDefaultValue = true //启用默认值 } }); public class CodeFirstUnitafa { [SugarColumn(DefaultValue = "(strftime('%Y-%m-%d %H:%M:%S', 'now', 'localtime'))")] public DateTime Name { get; set; } [SugarColumn(DefaultValue = "1")] public string Name2 { get; set; } }
请升级:SqlSugarCore 5.1.4.108-preview25+
SqlSugarClient db = new SqlSugarClient(new ConnectionConfig() { DbType = DbType.Sqlite, ConnectionString = Config.ConnectionString3, InitKeyType = InitKeyType.Attribute, IsAutoCloseConnection = true, MoreSettings=new ConnMoreSettings() { SqliteCodeFirstEnableDescription= true //启用备注 } });
下面建表就有备注了
CREATE TABLE "CodeFirstUnitafa121"( "Id" integer NOT NULL PRIMARY KEY AUTOINCREMENT /*编号*/ , "Name" datetime NOT NULL DEFAULT (strftime('%Y-%m-%d %H:%M:%S', 'now', 'localtime')) /*时间*/, "Name2" varchar(255) NOT NULL DEFAULT '1' ) /*姓名*/
请升级:SqlSugarCore 5.1.4.118-preview04+
var db = new SqlSugarClient(new ConnectionConfig() { IsAutoCloseConnection = true, DbType = DbType.Sqlite, ConnectionString = Connection, MoreSettings = new ConnMoreSettings() { SqliteCodeFirstEnableDropColumn = true //只支持.net core } }
当我们不想要文件,想用Sqlite作为缓存使用 ,用法如下:
using (var db = new SqlSugarClient(new ConnectionConfig() { IsAutoCloseConnection = false,//内存方式需要手动释放 DbType = DbType.Sqlite,//使用内存memory 要手动释放 ConnectionString = "Data Source=:memory:", })) { //通过using 或者 db.Close手动释放 db.CodeFirst.InitTables<UserInfo002>();//建表 db.Insertable(userInfo).ExecuteCommand(); }
注意:正常情况都是使用的文件,不要用内存
这个输出是正常现象用 db.colse会有 用db.dispose就不会有 如果你真想没有,那么你就用using(var db=new sqlsugarclient)
The type initializer for 'Microsoft.Data.Sqlite.SqliteConnection' threw an exception
出现这个错一般是安装问题
(1) 独立安装 Microsoft.Data.Sqlite.Core每个类都统一最新版本(先卸载sqlsugarcore)
(2) 如是发布Linux找不到文件报这个错 ( 发布不要用裁剪 )
(2.1)用户解决方案 https://www.donet5.com/Ask/9/23442
(2.2)用较高版本 Linux版本自带装好sqlite3的 比如:华为欧拉openEuler 22.03 (LTS-SP3)
不要用停止维护的Linux版本,如果用了就比较麻烦需要看 2.1方案补上缺失文件
存在错误格式的时间数据库,可以清空表用ORM重新插入
2016 © donet5.comApache Licence 2.0