.NET操作 Sqlite

连接字符串

//相对路径 - 推荐
//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  
                    });

Sqlite加密

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慢的问题

.Net Framework新人包

当遇到Nuget安装System.Data.SQLite失败或者无法安装,或者一直报引用兼容错误不知道如何解决请使用 新人包

Sqlite兼容驱动包下载.rar

1、Nuget安装SqlSugar或者引用最新的SqlSugar.dll

2、解压下载文件包 

3、System.Data.SQLite.dll 引用到项目

4、x86 x64 2个文件夹扔到bin下面的dll 同一目录

可以跑的DEMO

如果还不会安装的话可以拿这个DEMO跑了试试

SugarRepository.rar

五、并行写入

 5. 1 性能测试

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");

Sqlite CodeFirst 默认值

请升级: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; }
   }

Sqlite CodeFirst备注

请升级: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'  ) /*姓名*/

Sqlite CodeFirst删除列

请升级: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
    }

}

Memory 用法

当我们不想要文件,想用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(); 

  }

注意:正常情况都是使用的文件,不要用内存

常见错误

1.database is locked

这个输出是正常现象用 db.colse会有 用db.dispose就不会有  如果你真想没有,那么你就用using(var db=new sqlsugarclient)

2.The type initializer for ..

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方案补上缺失文件

YK2BI7Q6DY_55_CZ]1SSP2L.png

3.查询不到时间

存在错误格式的时间数据库,可以清空表用ORM重新插入

关闭
果糖网