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);