Skip to content

Commit

Permalink
- 增加 Oracle CLOB/NCLOB 大文本类型读写支持;#259
Browse files Browse the repository at this point in the history
  • Loading branch information
28810 authored and 28810 committed Mar 30, 2020
1 parent cdfe48a commit 7795296
Show file tree
Hide file tree
Showing 4 changed files with 74 additions and 0 deletions.
16 changes: 16 additions & 0 deletions FreeSql.DbContext/FreeSql.DbContext.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

48 changes: 48 additions & 0 deletions FreeSql.Tests/FreeSql.Tests/Oracle/OracleCodeFirstTest.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using FreeSql.DataAnnotations;
using Newtonsoft.Json;
using Oracle.ManagedDataAccess.Client;
using System;
using System.Collections.Generic;
using System.Linq;
Expand All @@ -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<TS_CLB01>().Where(a => a.Id == item1.Id).First();
Assert.Equal(str1, item2.Data);

//NoneParameter
item1 = new TS_CLB01 { Data = str1 };
Assert.Throws<OracleException>(() => 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<TS_BLB01>().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<OracleException>(() => 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()
{
Expand Down
6 changes: 6 additions & 0 deletions Providers/FreeSql.Provider.Oracle/OracleCodeFirst.cs
Original file line number Diff line number Diff line change
Expand Up @@ -441,6 +441,12 @@ internal static string GetOracleSqlTypeFullName(object[] row)
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")
Expand Down
4 changes: 4 additions & 0 deletions Providers/FreeSql.Provider.Oracle/OracleUtils.cs
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,10 @@ public override DbParameter AppendParamter(List<DbParameter> _params, string par
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);
Expand Down

0 comments on commit 7795296

Please sign in to comment.