5.1.4.197版本升级了最新的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 以上版本因为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不是varchar2,如果varchr2我们可以加上转换
[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都没有修复
总共就4种方案
1、ODBC连接性能很差
https://www.donet5.com/Home/Doc?typeId=2441
2、OceanBase的Oracle模式(底层也是ODBC支持的功能比ODBC多些)
https://www.donet5.com/Home/Doc?typeId=2564
3、改字符集(推荐 ORACLE官方都不修复BUG,建议改字符集一了百了)
4、OLEDB实现 (Access就是oledb,语法不支持用db.ado.方法)查看
5、Gitee搜索:SqlSugar 下载OracleUS7ASCLL 专用版本 如下图
该方案只支持.net framework(需要装:oracle instance client )
新版本使用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参数化看标题7var 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; }
//sqlsugar高版本可以
var p = new SugarParameter("@name", "a") { CustomDbType = OracleDbType.Varchar2 };
//低版本
var p = new SugarParameter("@name", "a");
p.IsVarchar2= true;如果所有表都是varchar2可以通过Aop中ChangeSql全部替换掉
if(p.DbType==DbType.String ||p.DbType==DbType.AnsiString) p.CustomDbType = OracleDbType.Varchar2
2016 © donet5.comApache Licence 2.0