From 7795296328db3ef96bbb37fc1377fed009e0dfca Mon Sep 17 00:00:00 2001 From: 28810 <28810@YEXIANGQIN> Date: Tue, 31 Mar 2020 05:56:49 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E5=A2=9E=E5=8A=A0=20Oracle=20CLOB/NCLOB=20?= =?UTF-8?q?=E5=A4=A7=E6=96=87=E6=9C=AC=E7=B1=BB=E5=9E=8B=E8=AF=BB=E5=86=99?= =?UTF-8?q?=E6=94=AF=E6=8C=81=EF=BC=9B#259?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql.DbContext/FreeSql.DbContext.xml | 16 +++++++ .../Oracle/OracleCodeFirstTest.cs | 48 +++++++++++++++++++ .../OracleCodeFirst.cs | 6 +++ .../FreeSql.Provider.Oracle/OracleUtils.cs | 4 ++ 4 files changed, 74 insertions(+) diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index 28fdb213..ddd18378 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -110,6 +110,13 @@ 清空状态数据 + + + 根据 lambda 条件删除数据 + + + + 添加 @@ -204,6 +211,15 @@ + + + 批量注入 Repository,可以参考代码自行调整 + + + + + + 动态Type,在使用 Repository<object> 后使用本方法,指定实体类型 diff --git a/FreeSql.Tests/FreeSql.Tests/Oracle/OracleCodeFirstTest.cs b/FreeSql.Tests/FreeSql.Tests/Oracle/OracleCodeFirstTest.cs index 8e7d09c8..68b9de63 100644 --- a/FreeSql.Tests/FreeSql.Tests/Oracle/OracleCodeFirstTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Oracle/OracleCodeFirstTest.cs @@ -1,5 +1,6 @@ using FreeSql.DataAnnotations; using Newtonsoft.Json; +using Oracle.ManagedDataAccess.Client; using System; using System.Collections.Generic; using System.Linq; @@ -10,6 +11,53 @@ namespace FreeSql.Tests.Oracle { public class OracleCodeFirstTest { + [Fact] + public void Clob() + { + var str1 = string.Join(",", Enumerable.Range(0, 10000).Select(a => "й")); + + var item1 = new TS_CLB01 { Data = str1 }; + Assert.Equal(1, g.oracle.Insert(item1).ExecuteAffrows()); + + var item2 = g.oracle.Select().Where(a => a.Id == item1.Id).First(); + Assert.Equal(str1, item2.Data); + + //NoneParameter + item1 = new TS_CLB01 { Data = str1 }; + Assert.Throws(() => g.oracle.Insert(item1).NoneParameter().ExecuteAffrows()); + //Oracle.ManagedDataAccess.Client.OracleException:ORA-01704: ַ̫ + } + class TS_CLB01 + { + public Guid Id { get; set; } + [Column(DbType = "clob")] + public string Data { get; set; } + } + [Fact] + public void Blob() + { + var str1 = string.Join(",", Enumerable.Range(0, 10000).Select(a => "й")); + var data1 = Encoding.UTF8.GetBytes(str1); + + var item1 = new TS_BLB01 { Data = data1 }; + Assert.Equal(1, g.oracle.Insert(item1).ExecuteAffrows()); + + var item2 = g.oracle.Select().Where(a => a.Id == item1.Id).First(); + Assert.Equal(item1.Data.Length, item2.Data.Length); + + var str2 = Encoding.UTF8.GetString(item2.Data); + Assert.Equal(str1, str2); + + //NoneParameter + item1 = new TS_BLB01 { Data = data1 }; + Assert.Throws(() => g.oracle.Insert(item1).NoneParameter().ExecuteAffrows()); + //Oracle.ManagedDataAccess.Client.OracleException:ORA-01704: ַ̫ + } + class TS_BLB01 + { + public Guid Id { get; set; } + public byte[] Data { get; set; } + } [Fact] public void StringLength() { diff --git a/Providers/FreeSql.Provider.Oracle/OracleCodeFirst.cs b/Providers/FreeSql.Provider.Oracle/OracleCodeFirst.cs index 6bf213c4..149011e7 100644 --- a/Providers/FreeSql.Provider.Oracle/OracleCodeFirst.cs +++ b/Providers/FreeSql.Provider.Oracle/OracleCodeFirst.cs @@ -441,6 +441,12 @@ and not exists(select 1 from all_constraints where constraint_name = a.index_nam else if (sqlType.StartsWith("BLOB")) { } + else if (sqlType.StartsWith("CLOB")) + { + } + else if (sqlType.StartsWith("NCLOB")) + { + } else if (char_used.ToLower() == "c") sqlType += sqlType.StartsWith("N") ? $"({data_length / 2})" : $"({data_length / 4} CHAR)"; else if (char_used.ToLower() == "b") diff --git a/Providers/FreeSql.Provider.Oracle/OracleUtils.cs b/Providers/FreeSql.Provider.Oracle/OracleUtils.cs index d28c66c5..6f2ce884 100644 --- a/Providers/FreeSql.Provider.Oracle/OracleUtils.cs +++ b/Providers/FreeSql.Provider.Oracle/OracleUtils.cs @@ -40,6 +40,10 @@ namespace FreeSql.Oracle if (col.DbPrecision != 0) ret.Precision = col.DbPrecision; if (col.DbScale != 0) ret.Scale = col.DbScale; break; + case OracleDbType.Clob: + case OracleDbType.NClob: + ret = new OracleParameter { ParameterName = QuoteParamterName(parameterName), OracleDbType = dbtype2, Value = value }; + break; } } _params?.Add(ret);