C#与Sqlite数据库
·
1,一般的访问方式。
1.1,连接语句。
//sqlite 连接,支持相对位置,也支持绝对位置
Data Source=../../Database/cater.db
// 连接数据库,FailIfMissing=false时若文件不存在会自动创建
string connStr ="DataSource=test.db;Version=3;Pooling=true;FailIfMissing=false;";
1.2,配置文件设置。
//需在配置文件中进行如下配置否则报错
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup>
1.3,常用语法。
//语法:
select * from AlarmHistory
insert into alarmhistory (AlarmDetails,starttime) values ('abc',getdate())
//获取当前时间
select datetime('now')
SELECT datetime('now', 'localtime');
select CURRENT_TIMESTAMP
//插入当前时间
insert into alarmhistory (alarmdetails,starttime) values('',datetime('now','localtime'))
//查找为null的数据
select * from alarmhistory where StartTime is null
//修改表格序号
update sqlite_sequence set seq = 0 where name = 'AlarmHistory'
//查询表格主键
select * from
pragma_table_info ('ActualData') where pk=1
//查询表格是否存在
select exists( select * from sqlite_master where type='table' and name='ActualData')
//删除表格
drop table 'ActualData'
//获取和设置时间,时间格式只支持类似yyyy-MM-dd这样用-连接的格式,若用/连接则无效
select datetime('2024-08-22 16:23:55')
SELECT datetime('now', 'localtime');
1.4,SQLite访问dll。
https://download.csdn.net/download/lingxiao16888/89914696
2,基于EntityFramework的ORM数据访问。
2.1,安装Nuget包
这部分比较简单,直接Nuget包中下载即可
- System.Data.SQLite
- System.Data.SQLite.EF6
- System.Data.SQLite.LINQ
- SQLite.CodeFirst


2.2,配置文件需要进行如下修改。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup>
<entityFramework>
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
<provider invariantName="System.Data.SQLite" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
<provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
</providers>
</entityFramework>
<system.data>
<DbProviderFactories>
<remove invariant="System.Data.SQLite.EF6" />
<add name="SQLite Data Provider (Entity Framework 6)" invariant="System.Data.SQLite.EF6" description=".NET Framework Data Provider for SQLite (Entity Framework 6)" type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6" />
<remove invariant="System.Data.SQLite" />
<add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".NET Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" />
</DbProviderFactories>
</system.data>
</configuration>
2.3,应用。
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity;
using System.Data.SQLite;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp2
{
class Program
{
static void Main(string[] args)
{
MyDbContext context = new MyDbContext("cater.db");
var set = context.Set<MemmberType>();
var ss = set.FirstOrDefault();
foreach (var item in set)
{
Console.WriteLine($"{item.MemTpName} ; {item.MemType} ; {item.MemTpDesc} ; {item.SubBy} ;{item.DelFlag}");
}
Console.WriteLine("输出完成!");
Console.ReadKey();
}
}
class MyDbContext : DbContext
{
public MyDbContext(string constr) : base(new SQLiteConnection
{
ConnectionString = new SQLiteConnectionStringBuilder
{
DataSource = constr,
ForeignKeys = true
}.ConnectionString
}
, true)
{
}
//如果查询 MemmberType 表,则该属性不能省略
public virtual DbSet<MemmberType> MemmberType { get; set; }
}
[Table("MemmberType")]//该特性不能省略
class MemmberType
{
[Key]//如果存在主键该特性不能省略
[Column("MemType",TypeName ="INT")]
[Required]//必要非空
// [DatabaseGenerated(DatabaseGeneratedOption.None)]//主键不自增
public int MemType { get; set; }
//[Column("MemTpName")]
public string MemTpName { get; set; }
[Column("MemTpDesc")]//可使用 Required 特性指定该列不能为空
public string MemTpDesc { get; set; }
//[Column("DelFlag")]
public int DelFlag { get; set; }
//[Column("SubBy")]
public int SubBy { get; set; }
}
}
2.4,效果。
数据库文件数据。

查询结果。

3,基于EntityFrameworkCore的数据访问。
3.1,安装Nuget包

3.2,配置上下文。
public class XHDbContext : DbContext
{
public XHDbContext(DbContextOptions<XHDbContext> options)
: base(options)
{
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
//配置是否跟踪实体状态
//optionsBuilder.UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking);
// EFCore的数据库执行日志,可以跟踪时使用
//optionsBuilder.LogTo(Console.WriteLine);
if (!optionsBuilder.IsConfigured)
{
// optionsBuilder.UseSqlServer("Data Source=LITTLESEAPAD;Initial Catalog=XHSmartParking;Persist Security Info=True;User ID=sa;Password=abc123;Trust Server Certificate=True");
optionsBuilder.UseSqlite("Data Source=DataBase/smartparking.db");
}
// 关于System.InvalidOperationException:“There is already an open DataReader associated with this Connection which must be closed first.”
// 的异常处理:在连接字符串后添加“MultipleActiveResultSets=true”
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
//// 联合主键
//pk.RoleId, pk.MenuId 构成一个混合主键,这样就不需要额外配置一个ID主键
//modelBuilder.Entity<RoleMenu>()
// .HasKey(pk => new { pk.RoleId, pk.MenuId });
//modelBuilder.Entity<RoleUser>()
// .HasKey(pk => new { pk.RoleId, pk.UserId });
//// 角色表的一对多关系 角色对用户
modelBuilder.Entity<RoleUser>()
.HasKey(roleUser => roleUser.Id);
modelBuilder.Entity<RoleUser>()
.HasOne(u => u.SysRole)
.WithMany(r => r.Users)
.HasForeignKey(roleUser => roleUser.RoleId)
.OnDelete(DeleteBehavior.Cascade);
//// 用户对角色
modelBuilder.Entity<RoleUser>()
.HasOne(u => u.User)
.WithMany(r => r.Roles)
.HasForeignKey(roleUser => roleUser.UserId)
.OnDelete(DeleteBehavior.Cascade);
modelBuilder.Entity<RoleMenu>()
.HasKey(roleMenu => roleMenu.Id);
modelBuilder.Entity<RoleMenu>()
.HasOne(u => u.SysRole)
.WithMany(r => r.Menus)
.HasForeignKey(roleMenu=>roleMenu.RoleId)
.OnDelete(DeleteBehavior.Cascade);
modelBuilder.Entity<RoleMenu>()
.HasOne(u => u.SysMenu)
.WithMany(r => r.Roles)
.HasForeignKey(roleMenu => roleMenu.MenuId)
.OnDelete(DeleteBehavior.Cascade);
// 页面-》数据库的转换
// 数据库-》页面的转换
ValueConverter iconValueConverter =
new ValueConverter<string, string>(
p2d => string.IsNullOrEmpty(p2d) ? null : ((int)p2d.ToArray()[0]).ToString("x"),
d2p => d2p == null ? "" : ((char)int.Parse(d2p, NumberStyles.HexNumber)).ToString()
);
modelBuilder.Entity<SysMenu>()
.Property(m => m.MenuIcon)
.HasConversion(iconValueConverter);
//格式转换
ValueConverter dateValueConverter = new ValueConverter<string, string>(
c2p => string.IsNullOrEmpty(c2p) ? null :DateTime.Parse( c2p).ToString("yyyyMMddHHmmss"),
p2c => p2c == null ? null : DateTime.ParseExact(p2c, "yyyyMMddHHmmss", CultureInfo.CurrentCulture).ToString()
);
modelBuilder.Entity<OrderInfo>()
.Property(order => order.EnterTime)
.HasConversion(dateValueConverter);
modelBuilder.Entity<OrderInfo>()
.Property(order => order.LeaveTime)
.HasConversion(dateValueConverter);
}
public virtual DbSet<SysUser> SysUser { get; set; }
public virtual DbSet<SysMenu> SysMenu { get; set; }
public virtual DbSet<SysRole> SysRole { get; set; }
public virtual DbSet<RoleMenu> RoleMenu { get; set; }
public virtual DbSet<RoleUser> RoleUser { get; set; }
public virtual DbSet<DeviceInfo> DeviceInfo { get; set; }
public virtual DbSet<AutoRegister> AutoRegister { get; set; }
public virtual DbSet<BaseLicenseColor> BaseLicenseColor { get; set; }
public virtual DbSet<BaseLicenseType> BaseLicenseType { get; set; }
public virtual DbSet<BaseAutoColor> BaseAutoColor { get; set; }
public virtual DbSet<BaseAutoType> BaseAutoType { get; set; }
public virtual DbSet<BaseFeeMode> BaseFeeMode { get; set; }
public virtual DbSet<MemberRecharge> MemberRecharge { get; set; }
public virtual DbSet<RecordInfo> RecordInfo { get; set; }
public virtual DbSet<OrderInfo> OrderInfo { get; set; }
}
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)