前言

对于 Oracle US7ASCII 中文乱码的问题,Ado.Net 和 Odbc 无奈解决。包含最新的.Net Core、.NET6、.NET7 都无奈解决这个问题。

FreeSql 对 Oracle 反对十分敌对,是 c#.net ORM 不二之选,提供了 Ado.net 实现包 FreeSql.Provider.Oracle,Odbc 实现包 FreeSql.Provider.Odbc,Oledb 实现包 FreeSql.Provider.OracleOledb,他们都反对 .NETCore2.1+、.NET4.0+ 等最新或较低的 .NETFramework 版本。

FreeSql 拜访 Oracle 只须要援用 FreeSql.Provider.Oracle/FreeSql.Provider.Odbc/FreeSql.Provider.OracleOledb 任意一个包即可。

若想以 Ado.net 驱动拜访数据库,请装置:

dotnet add package FreeSql.Provider.Oracle

若想以 ODBC 驱动拜访数据库,请装置:

dotnet add package FreeSql.Provider.Odbc

若想以 Oledb 驱动拜访数据库,请装置:

dotnet add package FreeSql.Provider.OracleOledb

解决办法

装置 FreeSql.Provider.OracleOledb 应用 Oledb 驱动解决读取应用 US7ASCII 的 Oracle 数据库中文显示乱码问题。

无关 US7ASCII Oracle 参考了其余解决办法:

C#解决读取应用US7ASCII的oracle数据库中文显示乱码问题https://blog.csdn.net/guhun_shmily/article/details/83064225
public class DB{    static Lazy<IFreeSql> oracleLazy = new Lazy<IFreeSql>(() => new FreeSql.FreeSqlBuilder()        .UseConnectionString(FreeSql.DataType.Oracle, "Provider=OraOLEDB.Oracle;user id=9user;password=123456;data source=//127.0.0.1:1521/XE;Pooling=true;Max Pool Size=2")        //.UseConnectionString(FreeSql.DataType.OdbcOracle, "...") //ODBC 特定类型        .UseAutoSyncStructure(true)        .UseNameConvert(FreeSql.Internal.NameConvertType.ToUpper)        .UseNoneCommandParameter(true)        .UseMonitorCommand(cmd => Trace.WriteLine(cmd.CommandText))        .Build());    public static IFreeSql oracle => oracleLazy.Value;}

定义 DB.cs 类之后就能够高兴的 CRUD 了。FreeSql 提供多种 CRUD 应用习惯,请依据理论状况抉择团队适合的一种:

  • 要么 FreeSql,原始用法;
  • 要么 FreeSql.Repository,仓储+工作单元习惯;
  • 要么 FreeSql.DbContext,有点像 EFCore 的应用习惯;
  • 要么 FreeSql.BaseEntity,求简略应用这个;
  • 要么 间接像 dapper 那样应用 OracleConnection 扩大办法;

CRUD 模式一:原始用法 API

DB.oracle.Select<T>(); //查问DB.oracle.Insert<T>(); //插入DB.oracle.Update<T>(); //更新DB.oracle.Delete<T>(); //删除DB.oracle.InsertOrUpdate<T>()// 插入或更新DB.oracle.Transaction(..); //事务DB.oracle.CodeFirst; //CodeFirst 对象DB.oracle.DbFirst; //DbFirst 对象DB.oracle.Ado; //Ado 对象DB.oracle.Aop; //Aop 对象DB.oracle.GlobalFilter; //全局过滤器对象var blogs = fsql.Select<Blog>()    .Where(b => b.Rating > 3)    .OrderBy(b => b.Url)    .Page(2, 10)    .ToList();var blog = new Blog { Url = "http://sample.com" };blog.BlogId = (int)fsql.Insert(blog).ExecuteIdentity();fsql.Update<Blog>()    .Set(b => b.Url, "http://sample2222.com")    .Where(b => b.Url == "http://sample.com")    .ExecuteAffrows();fsql.Delete<Blog>()    .Where(b => b.Url == "http://sample.com")    .ExecuteAffrows();// 等等等。。

⛳ CRUD 模式二:仓储 + 工作单元

FreeSql.Repository 作为扩大,实现了通用仓储层性能。与其余标准规范一样,仓储层也有相应的标准定义。FreeSql.Repository 参考 abp vnext 接口,定义和实现根底的仓储层(CURD),应该算比拟通用的办法吧。

  • Select/Attach 快照对象,Update 只更新变动的字段;
  • Insert 插入数据,适配各数据库优化执行 ExecuteAffrows/ExecuteIdentity/ExecuteInserted;
  • InsertOrUpdate 插入或更新;
  • SaveMany 办法疾速保留导航对象(一对多、多对多);
  • 工作单元治理事务
public class SongService{    readonly IBaseRepository<Song> _repoSong;    readonly IBaseRepository<Detail> _repoDetail;    public SongService(IBaseRepository<Song> repoSong, IBaseRepository<Detail> repoDetail)    {        _repoSong = repoSong;        _repoDetail = repoDetail;    }    [Transactional]    public virtual void Test1()    {        //这里 _repoSong、_repoDetail 所有操作都是一个工作单元        this.Test2();    }    [Transactional(Propagation = Propagation.Nested)]    public virtual void Test2() //嵌套事务    {        //这里 _repoSong、_repoDetail 所有操作都是一个工作单元    }}
属性返回值阐明
EntityTypeType仓储正在操作的实体类型,留神它不肯定是 TEntity
UnitOfWorkIUnitOfWork正在应用的工作单元
OrmIFreeSql正在应用的 Orm
DbContextOptionsDbContextOptions正在应用的 DbContext 设置,批改设置不影响其余
DataFilterIDataFilter\<TEntity\>仓储过滤器,本对象内失效
UpdateDiyIUpdate\<TEntity\>筹备更新数据,与仓储同事务
SelectISelect\<TEntity\>筹备查问数据
办法返回值参数阐明
AsTypevoidType扭转仓储正在操作的实体类型
GetTEntityTKey依据主键,查问数据
FindTEntityTKey依据主键,查问数据
DeleteintTKey依据主键删除数据
DeleteintLambda依据 lambda 条件删除数据
DeleteintTEntity删除数据
DeleteintIEnumerable\<TEntity\>批量删除数据
DeleteCascadeByDatabaseList\<object\>Lambda依据导航属性递归数据库删除数据
Insert-TEntity插入数据,若实体有自增列,插入后的自增值会填充到实体中
Insert-IEnumerable\<TEntity\>批量插入数据
Update-TEntity更新数据
Update-IEnumerable\<TEntity\>批量更新数据
InsertOrUpdate-TEntity插入或更新数据
FlushState-革除状态治理数据
Attach-TEntity附加实体到状态治理,可用于不查问就更新或删除
Attach-IEnumerable\<TEntity\>批量附加实体到状态治理
AttachOnlyPrimary-TEntity只附加实体的主键数据到状态治理
SaveMany-TEntity, string保留实体的指定 ManyToMany/OneToMany 导航属性(残缺比照)
BeginEdit-List\<TEntity\>筹备编辑一个 List 实体
EndEditint实现编辑数据,进行保留动作
状态治理,可实现 Update 只更新变动的字段(不更新所有字段),灵便应用 Attach 和 Update 用起来十分难受。

⚡ CRUD 模式三:DbContext

FreeSql.DbContext 实现相似 EFCore 应用习惯,跟踪对象状态,最终通过 SaveChanges 办法提交事务。

FreeSql 可自动识别 EFCore 实体个性 Key/Required/NotMapped/MaxLength/StringLength/DatabaseGenerated/Table/Column。

  • Select/Attach 快照对象,Update 只更新变动的字段;
  • Add/AddRange 插入数据,适配各数据库优化执行 ExecuteAffrows/ExecuteIdentity/ExecuteInserted;
  • AddOrUpdate 插入或更新;
  • SaveMany 办法疾速保留导航对象(一对多、多对多);
using (var ctx = DB.oracle.CreateDbContext()) {  //var db1 = ctx.Set<Song>();  //var db2 = ctx.Set<Tag>();  var item = new Song { };  ctx.Add(item);  ctx.SaveChanges();}// 或者

public class SongContext : DbContext {

public DbSet<Song> Songs { get; set; }
public DbSet<Tag> Tags { get; set; }

protected override void OnConfiguring(DbContextOptionsBuilder builder) {

builder.UseFreeSql(DB.oracle);

}

//每个 DbContext 只触发一次
protected override void OnModelCreating(ICodeFirst codefirst)
{

codefirst.Entity<Song>(eb =>{  eb.ToTable("tb_song");  eb.Ignore(a => a.Field1);  eb.Property(a => a.Title).HasColumnType("varchar(50)").IsRequired();  eb.Property(a => a.Url).HasMaxLength(100);}

}
}

---##  CRUD 模式四:BaseEntityBaseEntity 是一种极简略的 CodeFirst 开发方式,特地对单表或多表CRUD,利用继承节俭了每个实体类的反复属性(创立工夫、ID等字段),软件删除等性能,进行 crud 操作时不用时常思考仓储的应用;> dotnet add package FreeSql.Extensions.BaseEntity

public class UserGroup : BaseEntity<UserGroup, int>
{

public string GroupName { get; set; }

}

//增加
var item = new UserGroup { GroupName = "组一" };
item.Insert();

//更新
item.GroupName = "组二";
item.Update();

//增加或更新
item.Save();

//软删除
item.Delete();

//复原软删除
item.Restore();

//依据主键获取对象
var item = UserGroup.Find(1);

//查问数据
var items = UserGroup.Where(a => a.Id > 10).ToList();

---##  CRUD 模式五:OracleConnection 扩大办法(相似 Dapper)提供了相似 Dapper 的应用办法,FreeSql 减少了 IDbConnection/IDbTransaction 对象的扩大办法 Select/Insert/Update/Delete 实现 CRUD。

using FreeSql;

using (var conn = new OracleConnection(...))
{
conn.Select<T>().Where(...).ToList();

conn.Insert(new T {}).ExecuteAffrows();
conn.Update().SetSource(new T {}).ExecuteAffrows();
conn.InsertOrUpdate().SetSource(new T {}).ExecuteAffrows();

conn.Delete<T>().Where(...).ExecuteAffrows();
}

- 每个 OracleConnection GetFreeSql() 返回的 IFreeSql 实例雷同;- 能够对 fsql 设置 Aop 事件,比方监督 SQL;- IFreeSql 本身的成员 IDbFirst、Transaction 不可用;利用本性能能够疾速将 FreeSql 应用到我的项目中,只须要解决好实体类的个性。提醒:FreeSql 兼容 EFCore 99% 的实体个性---##  性能个性- 反对 CodeFirst 模式;- 反对 DbFirst 模式,反对从数据库导入实体类,或应用[实体类生成工具](https://freesql.net/guide/db-first.html)生成实体类;- 反对 丰盛的表达式函数,以及灵便的自定义解析;- 反对 导航属性一对多、多对多贪心加载,延时加载,级联保留,级联删除;- 反对 读写拆散、分表分库、过滤器、乐观锁、乐观锁、分布式事务、多租户(按字段/表/库);- 反对 MySql/SqlServer/PostgreSQL/Oracle/Sqlite/Firebird/达梦/人大金仓/神舟通用/南大通用/翰高/华为高斯/ClickHouse/Access 等数据库;FreeSql .NET ORM 反对 .NetFramework4.0+、.NetCore、Xamarin、MAUI、Blazor、以及还有说不出来的运行平台,因为代码**绿色无依赖**,反对新平台非常简单。目前单元测试数量:8500+,Nuget下载数量:1M+。QQ群:4336577(已满)、8578575(在线)、52508226(在线)FreeSql 应用最宽松的开源协定 MIT [https://github.com/dotnetcore/FreeSql](https://github.com/dotnetcore/FreeSql) ,能够商用,文档齐全,甚至拿去卖钱也能够。8500+个单元测试作为基调,反对10少数数据库,咱们提供了通用Odbc实践上反对所有数据库,目前已知有群友应用 FreeSql 操作华为高斯、mycat、tidb 等数据库。装置时只须要抉择对应的数据库实现包。轻量化解释:理解 FreeRedis、FreeSql、csredis 的人都晓得,咱们公布的开源我的项目是绿色著称,零依赖公布后只有一个DLL,不会造成使用者我的项目依赖抵触,反对 .NET 4.0 堪称屎山我的项目的救星。当初还有很多.NET FX4.0 的我的项目,这些我的项目因历史遗留起因或硬件限度,不能更换 .NET Core 版本。因而这些我的项目很难应用到现有的开源库,不能应用牢靠的开源库,那么很多时候都要自行实现,在沉积代码的同时,我的项目也有可能越来越乱,代码越来越渣,我的项目逐步变得不稳固。---##  结束语无关 US7ASCII Oracle 参考了其余解决办法:C#解决读取应用US7ASCII的oracle数据库中文显示乱码问题