//相对路径 - 推荐
//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慢的问题
SqlSugarCore //nuget只安装这个就行了
当遇到Nuget安装System.Data.SQLite失败或者无法安装,或者一直报引用兼容错误不知道如何解决请使用 新人包
1、Nuget安装SqlSugar或者引用最新的SqlSugar.dll
2、解压下载文件包
3、System.Data.SQLite.dll 引用到项目
4、x86 x64 2个文件夹扔到bin下面的dll 同一目录
System.Data.SQLite.x86 //启动项目也需要安装 SqlSugar
如果还不会安装的话可以拿这个DEMO跑了试试
NUGET:System.Data.SQLite.x86
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每个类都统一最新版本(先卸载sqlsugarcore)
(2) 如是发布Linux找不到文件报这个错 ( 发布不要用裁剪 )
(2.1)用户解决方案 https://www.donet5.com/Ask/9/23442
(2.2)用较高版本 Linux版本自带装好sqlite3的 比如:华为欧拉openEuler 22.03 (LTS-SP3)
不要用停止维护的Linux版本,如果用了就比较麻烦需要看 2.1方案补上缺失文件
![YK2BI7Q6DY_55_CZ]1SSP2L.png YK2BI7Q6DY_55_CZ]1SSP2L.png](/_theme/ueditor/utf8-net/net/upload/image/20240531/6385276381592979253533364.png)
存在错误格式的时间数据库,可以清空表用ORM重新插入
2016 © donet5.comApache Licence 2.0