//写法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 以上版本
因为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 代替后,功能一模一样
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 就行了
Out SYS_REFCURSOR
var p = new SugarParameter("@name", ""); //有的传null报错,这边可以换了试试 null和"" p.IsRefCursor = true;// 游标 //如果是output还需要加下面一行 p.Direction = System.Data.ParameterDirection.Output; //执行SQL后p.Value 就会返回值
升级较新版本即可
1. 当批量更新比循环更新还慢的时候 : 升级版本可以解决
2、使用BulkCopy
具体用法:https://www.donet5.com/Home/Doc?typeId=2404
可能是你的数据库字段是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
默认是varchar不是varchar,如果varchra我们可以加上转换
[SugarColumn(ColumnDataType = "nvarchar2",SqlParameterDbType =typeof(Nvarchar2PropertyConvert) )] public string Name { get; set; }
1、参数化分页插入
db.Insertable(List<实体>).UseParameter().ExecuteCommand()//Oracle中大数据插入性能会提升很多
2、使用BulkCopy
具体用法:https://www.donet5.com/Home/Doc?typeId=2404
关注新版本如果NUGET没有就还没发布
var p1 = new SugarParameter("@p", 1); p1.IsClob = true; //实体操作看标题15
传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*/ }
“ORA-26028: 索引 ZHUCHE.PK_TESTFAST11_ID 在最初处于无法使用的状态”
bulkCopy导入时导入重复数据,特别拖断点处理的时候,失效导入进去重复数据
解决方案:
alter table TESTFAST11 drop primary key
找出重复数据删掉
在重新创建索引
ORA-01745: 无效的主机/绑定变量名 ,可能表和字段名是关键字,因为ORACLE 就不像SQLSERVER加个转释就百分百处理了关键字命名
//可以用自定类型处理 [SugarColumn(SqlParameterDbType=typeof(CommonPropertyConvert))]//CommonPropertyConvertORM自带的可以重写 public DateTime DcValue { get; set; }//5.1.4.62版本支
5.1.4.140: Oracle 11 主键名字和参数名字超过30报错
ORM只处理主键约束的名字和参数化的名字,如果表名本身就超过30那只能修改表名
IsAutoCloseConnection = true, DbType = DbType.Oracle, ConnectionString = Connection, MoreSettings = new ConnMoreSettings() { MaxParameterNameLength = 30 //设置最大长度 }
部分用户出现大数据导入乱码,单独安装 升级到以下版本可以解决
Oracle.ManagedDataAccess.Core 3.21.50
建议改字符集:原因这个是ODB.NET ORACLE不打算支持,几年issues都没有修复
全方就下面3种方案
1、ODBC连接性能很差
2、改字符集(推荐 ORACLE官方都不修复BUG,建议改字符集一了百了)
3、Gitee搜索:SqlSugar 下载OracleUS7ASCLL 专用版本 如下图
只支持framework
新版本使用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); };
//需要升级到5.1.4.79-preview02 支持多库共存 [SugarColumn(SqlParameterDbType =typeof(NClobPropertyConvert) )] public string Name { get; set; } //写sql参数化看标题7
var p=new SugarParameter("@p",value); p.IsArray=true;
例如: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中有大于和小于函数或者用扩展函数都行
[SugarColumn(ColumnDataType = "nvarchar2",SqlParameterDbType =typeof(Nvarchar2PropertyConvert) )] public string Name { get; set; }
2016 © donet5.comApache Licence 2.0