- 增加 OracleUs7ascii 写入处理特性;

This commit is contained in:
2881099 2024-08-06 14:34:12 +08:00
parent 934be9cd9f
commit 8263c86a20
3 changed files with 64 additions and 3 deletions

View File

@ -1,4 +1,5 @@
using FreeSql.Internal; using FreeSql.DataAnnotations;
using FreeSql.Internal;
using FreeSql.Internal.CommonProvider; using FreeSql.Internal.CommonProvider;
using FreeSql.Internal.Model; using FreeSql.Internal.Model;
using FreeSql.Internal.ObjectPool; using FreeSql.Internal.ObjectPool;
@ -6,6 +7,7 @@ using System;
using System.Collections; using System.Collections;
using System.Data.Common; using System.Data.Common;
using System.Linq; using System.Linq;
using System.Reflection;
using System.Threading; using System.Threading;
namespace FreeSql.Oracle namespace FreeSql.Oracle
@ -50,7 +52,17 @@ namespace FreeSql.Oracle
else if (param is bool || param is bool?) else if (param is bool || param is bool?)
return (bool)param ? 1 : 0; return (bool)param ? 1 : 0;
else if (param is string) else if (param is string)
{
#if oledb
if (mapColumn?.Table != null && mapColumn.Table.Properties.TryGetValue(mapColumn.CsName, out var prop))
{
var us7attr = prop.GetCustomAttributes(typeof(OracleUS7AsciiAttribute), false)?.FirstOrDefault() as OracleUS7AsciiAttribute;
if (us7attr != null) return OracleUtils.StringToAscii(param as string, us7attr.Encoding);
}
#endif
return string.Concat("'", param.ToString().Replace("'", "''"), "'"); return string.Concat("'", param.ToString().Replace("'", "''"), "'");
}
else if (param is char) else if (param is char)
return string.Concat("'", param.ToString().Replace("'", "''").Replace('\0', ' '), "'"); return string.Concat("'", param.ToString().Replace("'", "''").Replace('\0', ' '), "'");
else if (param is Enum) else if (param is Enum)

View File

@ -1,11 +1,15 @@
using FreeSql.Internal; using FreeSql.DataAnnotations;
using FreeSql.Internal;
using FreeSql.Internal.Model; using FreeSql.Internal.Model;
using System; using System;
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Data.OleDb;
using System.Data.Common; using System.Data.Common;
using System.Data.OleDb;
using System.Globalization; using System.Globalization;
using System.Linq;
using System.Reflection;
using System.Text;
namespace FreeSql.Oracle namespace FreeSql.Oracle
{ {
@ -147,6 +151,12 @@ namespace FreeSql.Oracle
if (type == typeof(string)) if (type == typeof(string))
{ {
var valueString = value as string; var valueString = value as string;
if (col?.Table != null && col.Table.Properties.TryGetValue(col.CsName, out var prop))
{
var us7attr = prop.GetCustomAttributes(typeof(OracleUS7AsciiAttribute), false)?.FirstOrDefault() as OracleUS7AsciiAttribute;
if (us7attr != null) return StringToAscii(valueString, us7attr.Encoding);
}
if (valueString != null) if (valueString != null)
{ {
if (valueString.Length < 4000) return string.Concat("'", valueString.Replace("'", "''"), "'"); if (valueString.Length < 4000) return string.Concat("'", valueString.Replace("'", "''"), "'");
@ -166,5 +176,25 @@ namespace FreeSql.Oracle
} }
return FormatSql("{0}", value, 1); return FormatSql("{0}", value, 1);
} }
public static string StringToAscii(string value, string encoding) //US7ASCII
{
if (string.IsNullOrEmpty(value)) return "NULL";
var bytes = Encoding.GetEncoding(encoding).GetBytes(value);
var sb = new StringBuilder();
try
{
for (int i = 0; i < bytes.Length; i++)
{
if (i > 0) sb.Append("||");
sb.Append("chr(").Append(bytes[i].ToString()).Append(")");
}
return sb.ToString();
}
finally
{
sb.Clear();
}
}
} }
} }

View File

@ -0,0 +1,19 @@
using System;
namespace FreeSql.DataAnnotations
{
[AttributeUsage(AttributeTargets.Class)]
public class OracleUS7AsciiAttribute : Attribute
{
public OracleUS7AsciiAttribute() { }
public OracleUS7AsciiAttribute(string encoding)
{
this.Encoding = encoding;
}
/// <summary>
/// 编码
/// </summary>
public string Encoding { get; set; } = "GB2312";
}
}