Oracle .NET操作

Oracle字符串

//写法1
Data Source=localhost/orcl;User ID=system;Password=haha
//字法2 上面连不上可以试用下面写法
Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=150.158.57.125)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=ORCL)));User Id=xx;Password=xx;Pooling='true';Max Pool Size=150

表模式

分为大写和驼峰表2种模式,默认为大写表模式

 规范(大写表) 

表名 STUDENT  字段 ID  NAME   ,直接用就行了SqlSugar不需要设置

 SqlSugarClient db = new SqlSugarClient(new ConnectionConfig()
 {
       DbType = DbType.Oracle,
       ConnectionString = "Data Source=localhost/orcl;User ID=system;Password=haha",
       IsAutoCloseConnection = true
 });
 //自动生成下划线看PostgreSQL文档用法差不多

不规范(不转大写)

常见错误:ORA-00942: 表或视图不存在   , 出现这个错误是因为你数据库不是大写表,下面可以配置禁止转大写

 SqlSugarClient db = new SqlSugarClient(new ConnectionConfig()
 {
       DbType = DbType.Oracle,
       ConnectionString = "Data Source=localhost/orcl;User ID=system;Password=haha",
       IsAutoCloseConnection = true,
       MoreSettings=new ConnMoreSettings() { 
           IsAutoToUpper=false //是否转大写,默认是转大写的可以禁止转大写
   });

 表名 Student 字段 Id Name  ,需要禁用自动转大写

 SqlSugarClient db = new SqlSugarClient(new ConnectionConfig()
 {
       DbType = DbType.Oracle,
       ConnectionString = "Data Source=localhost/orcl;User ID=system;Password=haha",
       IsAutoCloseConnection = true,
       MoreSettings=new ConnMoreSettings() { 
           IsAutoToUpper=false //禁用自动转成大写表 5.1.3.41-preview04
       }
   });
  //注意:请升级到 5.1.3.41-preview04 以上版本

1、自增

1.1 序列实现自增  

因为Oracle12C以下不支持自增列,所以我们需要使用序列来实现自增列 

//数据库创建序列
create sequence SEQ_ID
minvalue 1
maxvalue 99999999
start with 1
increment by 1
nocache
order;

//实体类
public class OrderItem
{
    //给序列赋值 现在我们就可以实现自增列
    [SqlSugar.SugarColumn(IsPrimaryKey =true, OracleSequenceName = "SEQ_ID")]
    public int ItemId { get; set; }
    public int OrderId { get; set; }
    public decimal? Price { get; set; }
    [SqlSugar.SugarColumn(IsNullable = true)]
    public DateTime? CreateTime { get; set; }
}
//插入的时候ItemId 不需你去赋值,ORM会自已处理,也可以插成功后返回自增值


//插入返回自增列只支持单条返回自增
var id=db.Insertable(insertObj).ExecuteReturnIdentity();

Oracle中不使用 IsIdentity 而是用 OracleSequenceName 代替后,功能一模一样

1.2 原生自增列(12C+)

SqlSugar版本 5.1.4.85

SqlSugarClient db2 = new SqlSugarClient(new ConnectionConfig()
{
   DbType = DbType.Oracle,
   ConnectionString = Config.ConnectionString3,
   IsAutoCloseConnection = true,
    MoreSettings=new ConnMoreSettings() 
   {
          EnableOracleIdentity=true //启用Oracle自增列,需要12C以上版本,11G看文档1.1
   }
 });
 //实体只要配置IsIdentity=true,IsPrimaryKey =true 就行了

2、游标参数  

 Out SYS_REFCURSOR

var p = new SugarParameter("@name", ""); //有的传null报错,这边可以换了试试 null和""
p.IsRefCursor = true;// 游标

//如果是output还需要加下面一行
p.Direction = System.Data.ParameterDirection.Output;
//执行SQL后p.Value 就会返回值

3、Oracle时间存储带毫秒

升级较新版本即可

4、Oracle批量更新异常缓慢时

1. 当批量更新比循环更新还慢的时候 : 升级版本可以解决

2、使用BulkCopy

具体用法:https://www.donet5.com/Home/Doc?typeId=2404

5、查询非常慢

 5.1 时间字段引起的慢

可能是你的数据库字段是Date类型,所以查询的参数加上一个转换就行了

//可以设置参数类型,保证数据库一样就能走索引 默认是 System.Data.DbType.DateTime
[SugarColumn(SqlParameterDbType =System.Data.DbType.Date)]  
public DateTime Time{ get; set; }


//Ado.net
 var p = new SugarParameter("@p", DateTime.Now, System.Data.DbType.Date);

//老版本 表达式中可以用:SqlFunc.Oracle_ToDate

老版本:使用SqlFunc.Oracle_ToDate

 5.2 字符串引起的慢

默认是varchar不是varchar,如果varchra我们可以加上转换

[SugarColumn(ColumnDataType = "nvarchar2",SqlParameterDbType =typeof(Nvarchar2PropertyConvert) )]
public string Name { get; set; }

6、Oracle批量插入性能优化

1、参数化分页插入

db.Insertable(List<实体>).UseParameter().ExecuteCommand()//Oracle中大数据插入性能会提升很多

2、使用BulkCopy

具体用法:https://www.donet5.com/Home/Doc?typeId=2404


7、存储过程Clob (5.0.4.4)

关注新版本如果NUGET没有就还没发布

 var p1 = new SugarParameter("@p", 1);
 p1.IsClob = true;
 
 //实体操作看标题15

8、存储过程 blob

传null会报错: oracle value does not fall within theexpected range

var p1 = new SugarParameter(":p", byte[] );//不能是null ,可以是空new byte[]{}

常见错误:ORA-01461: 仅能绑定要插入 LONG 列的 LONG

解决方案:

1.升级11G补丁

2.升级Sqlsugar 5.1.4.131-preview05+版本+ 代码如下

var  p1=new SugarParameter(":p",byte[]) { CustomDbType =OracleDbType.Blob /*指定blob*/ }

9、索引破坏

“ORA-26028: 索引 ZHUCHE.PK_TESTFAST11_ID 在最初处于无法使用的状态”

bulkCopy导入时导入重复数据,特别拖断点处理的时候,失效导入进去重复数据

解决方案:

 alter table TESTFAST11 drop primary key

找出重复数据删掉

在重新创建索引

10、ORA-01745

ORA-01745: 无效的主机/绑定变量名 ,可能表和字段名是关键字,因为ORACLE 就不像SQLSERVER加个转释就百分百处理了关键字命名

//可以用自定类型处理
[SugarColumn(SqlParameterDbType=typeof(CommonPropertyConvert))]//CommonPropertyConvertORM自带的可以重写
public DateTime DcValue { get; set; }//5.1.4.62版本支

11、Oracle11_ 超出长度上限

5.1.4.140:  Oracle 11 主键名字和参数名字超过30报错

ORM只处理主键约束的名字和参数化的名字,如果表名本身就超过30那只能修改表名

   IsAutoCloseConnection = true,
   DbType = DbType.Oracle,
   ConnectionString = Connection,
   MoreSettings = new ConnMoreSettings()
   {
       MaxParameterNameLength = 30 //设置最大长度
   }

12、Db.Fastest 乱码

部分用户出现大数据导入乱码,单独安装 升级到以下版本可以解决

Oracle.ManagedDataAccess.Core 3.21.50

13、US7ASCII 乱码问题


建议改字符集:原因这个是ODB.NET ORACLE不打算支持,几年issues都没有修复

全方就下面3种方案

1、ODBC连接性能很差

2、改字符集(推荐 ORACLE官方都不修复BUG,建议改字符集一了百了)

3、Gitee搜索:SqlSugar  下载OracleUS7ASCLL 专用版本 如下图

只支持framework

image.png

14、特殊字符乱码

新版本使用Nvarchar2

//需要升级到5.1.4.71-preview02 
[SugarColumn(SqlParameterDbType =typeof(Nvarchar2PropertyConvert) )]
public string Name { get; set; }

老版本使用Nvarchar2

5.1.2.5-pview02 特殊字符使用NVarchar2编码

//Aop全局处理
db.Aop.OnExecutingChangeSql = (sql, pars) =>
            {
                if (pars != null)
                {
                    foreach (var item in pars)
                    {
                       //如果是DbTppe=string设置成OracleDbType.Nvarchar2 
                        item.IsNvarchar2 = true; 
                    }
                };
                return new KeyValuePair<string, SugarParameter[]>(sql, pars);
            };

15、NClob类型 

//需要升级到5.1.4.79-preview02 支持多库共存
[SugarColumn(SqlParameterDbType =typeof(NClobPropertyConvert) )]
public string Name { get; set; }

//写sql参数化看标题7

16、数组参数

var p=new SugarParameter("@p",value);
p.IsArray=true;

17、超出C#精度的类型处理

例如:FLOAT(64) Oracle驱动是不支持的,我们可以用下面的示例来实现

    //没有select情况特性中的QuerySql会生效
    var list=db.Queryable<UnitBigNumber>().ToList();
    
    //有Select这么写
    var list=db.Queryable<UnitBigNumber>().Select(it=>new UnitBigNumber 
            {
                adfadfa=it.adfadfa.ToString()//有Select需要自已转换
            }
            ,true).ToList()//true表示自动映射其他字段,id会自动赋值
 
    public class UnitBigNumber 
    {
     [SqlSugar.SugarColumn(IsPrimaryKey =true)]
     public int Id { get; set; }
     //QuerySql在单表没有select的查询中生效
     [SqlSugar.SugarColumn(QuerySql="CAST( Num AS varchar(100))",ColumnDataType="FLOAT(64)")]
     public string Num{ get; set; }
    }
    
    //运算和比较
    //SqlFunc中有大于和小于函数或者用扩展函数都行

18、Nvarchar2用法

[SugarColumn(ColumnDataType = "nvarchar2",SqlParameterDbType =typeof(Nvarchar2PropertyConvert) )]
public string Name { get; set; }


关闭
果糖网