- 完善 [Column(MapType = typeof(byte[]))] 对 Guid/string 的映射支持;

This commit is contained in:
28810 2020-01-07 00:41:22 +08:00
parent fbbd74f54c
commit 5afeea7711
33 changed files with 128 additions and 135 deletions

View File

@ -108,12 +108,14 @@ namespace FreeSql.Tests
.NoneParameter().ExecuteAffrows(); .NoneParameter().ExecuteAffrows();
var slslsl = g.oracle.Select<SendInfo>().ToList(); var slslsl = g.oracle.Select<SendInfo>().ToList();
var slsld1 = g.oracle.Select<SendInfo>().Where(a => a.ID == Guid.Parse("8D9C135E7FEBC41C00BE241C1771FF97")).ToList();
var slsld2 = g.oracle.Select<SendInfo>().Where(a => a.ID == slsld1[0].ID).ToList();
} }
[Table(Name = "t_text")] [Table(Name = "t_text")]
public class SendInfo public class SendInfo
{ {
[Column(IsPrimary = true)] [Column(IsPrimary = true, DbType = "raw(16)", MapType = typeof(byte[]))]
public Guid ID { get; set; } public Guid ID { get; set; }
[Column(Name = "YPID5")] [Column(Name = "YPID5")]

View File

@ -40,6 +40,12 @@ namespace FreeSql.Internal
public abstract string QuoteReadColumn(Type type, Type mapType, string columnName); public abstract string QuoteReadColumn(Type type, Type mapType, string columnName);
public virtual string FieldAsAlias(string alias) => $" {alias}"; public virtual string FieldAsAlias(string alias) => $" {alias}";
public virtual string IIF(string test, string ifTrue, string ifElse) => $"case when {test} then {ifTrue} else {ifElse} end"; public virtual string IIF(string test, string ifTrue, string ifElse) => $"case when {test} then {ifTrue} else {ifElse} end";
public static string BytesSqlRaw(byte[] bytes)
{
var sb = new StringBuilder();
foreach (var vc in bytes) sb.Append(vc.ToString("X2"));
return sb.ToString();
}
public IFreeSql _orm { get; set; } public IFreeSql _orm { get; set; }
public ICodeFirst CodeFirst => _orm.CodeFirst; public ICodeFirst CodeFirst => _orm.CodeFirst;

View File

@ -188,7 +188,7 @@ namespace FreeSql.Internal
//} //}
if (colattr.ServerTime != DateTimeKind.Unspecified && new[] { typeof(DateTime), typeof(DateTimeOffset) }.Contains(colattr.MapType.NullableTypeOrThis())) if (colattr.ServerTime != DateTimeKind.Unspecified && new[] { typeof(DateTime), typeof(DateTimeOffset) }.Contains(colattr.MapType.NullableTypeOrThis()))
{ {
col.DbDefaultValue = "'1970-1-1'"; col.DbDefaultValue = colattr.ServerTime == DateTimeKind.Local ? common.Now : common.NowUtc;
col.DbInsertValue = colattr.ServerTime == DateTimeKind.Local ? common.Now : common.NowUtc; col.DbInsertValue = colattr.ServerTime == DateTimeKind.Local ? common.Now : common.NowUtc;
col.DbUpdateValue = colattr.ServerTime == DateTimeKind.Local ? common.Now : common.NowUtc; col.DbUpdateValue = colattr.ServerTime == DateTimeKind.Local ? common.Now : common.NowUtc;
} }
@ -1608,6 +1608,19 @@ namespace FreeSql.Internal
if (obj == null) return null; if (obj == null) return null;
return string.Concat(obj); return string.Concat(obj);
} }
static byte[] GuidToBytes(Guid guid)
{
var bytes = new byte[16];
var guidN = guid.ToString("N");
for (var a = 0; a < guidN.Length; a += 2)
bytes[a / 2] = byte.Parse($"{guidN[a]}{guidN[a + 1]}", System.Globalization.NumberStyles.HexNumber);
return bytes;
}
static Guid BytesToGuid(byte[] bytes)
{
if (bytes == null) return Guid.Empty;
return Guid.TryParse(BitConverter.ToString(bytes, 0, Math.Min(bytes.Length, 36)).Replace("-", ""), out var tryguid) ? tryguid : Guid.Empty;
}
static ConcurrentDictionary<Type, ConcurrentDictionary<Type, Func<object, object>>> _dicGetDataReaderValue = new ConcurrentDictionary<Type, ConcurrentDictionary<Type, Func<object, object>>>(); static ConcurrentDictionary<Type, ConcurrentDictionary<Type, Func<object, object>>> _dicGetDataReaderValue = new ConcurrentDictionary<Type, ConcurrentDictionary<Type, Func<object, object>>>();
static MethodInfo MethodArrayGetValue = typeof(Array).GetMethod("GetValue", new[] { typeof(int) }); static MethodInfo MethodArrayGetValue = typeof(Array).GetMethod("GetValue", new[] { typeof(int) });
@ -1635,6 +1648,11 @@ namespace FreeSql.Internal
static PropertyInfo PropertyDateTimeOffsetDateTime = typeof(DateTimeOffset).GetProperty("DateTime", BindingFlags.Instance | BindingFlags.Public); static PropertyInfo PropertyDateTimeOffsetDateTime = typeof(DateTimeOffset).GetProperty("DateTime", BindingFlags.Instance | BindingFlags.Public);
static PropertyInfo PropertyDateTimeTicks = typeof(DateTime).GetProperty("Ticks", BindingFlags.Instance | BindingFlags.Public); static PropertyInfo PropertyDateTimeTicks = typeof(DateTime).GetProperty("Ticks", BindingFlags.Instance | BindingFlags.Public);
static ConstructorInfo CtorDateTimeOffsetArgsTicks = typeof(DateTimeOffset). GetConstructor(new[] { typeof(long), typeof(TimeSpan) }); static ConstructorInfo CtorDateTimeOffsetArgsTicks = typeof(DateTimeOffset). GetConstructor(new[] { typeof(long), typeof(TimeSpan) });
static Encoding DefaultEncoding = Encoding.UTF8;
static MethodInfo MethodEncodingGetBytes = typeof(Encoding).GetMethod("GetBytes", new[] { typeof(string) });
static MethodInfo MethodEncodingGetString = typeof(Encoding).GetMethod("GetString", new[] { typeof(byte[]) });
static MethodInfo MethodGuidToBytes = typeof(Utils).GetMethod("GuidToBytes", BindingFlags.NonPublic | BindingFlags.Static, null, new[] { typeof(Guid) }, null);
static MethodInfo MethodBytesToGuid = typeof(Utils).GetMethod("BytesToGuid", BindingFlags.NonPublic | BindingFlags.Static, null, new[] { typeof(byte[]) }, null);
public static ConcurrentBag<Func<LabelTarget, Expression, Type, Expression>> GetDataReaderValueBlockExpressionSwitchTypeFullName = new ConcurrentBag<Func<LabelTarget, Expression, Type, Expression>>(); public static ConcurrentBag<Func<LabelTarget, Expression, Type, Expression>> GetDataReaderValueBlockExpressionSwitchTypeFullName = new ConcurrentBag<Func<LabelTarget, Expression, Type, Expression>>();
public static ConcurrentBag<Func<LabelTarget, Expression, Expression, Type, Expression>> GetDataReaderValueBlockExpressionObjectToStringIfThenElse = new ConcurrentBag<Func<LabelTarget, Expression, Expression, Type, Expression>>(); public static ConcurrentBag<Func<LabelTarget, Expression, Expression, Type, Expression>> GetDataReaderValueBlockExpressionObjectToStringIfThenElse = new ConcurrentBag<Func<LabelTarget, Expression, Expression, Type, Expression>>();
@ -1644,7 +1662,19 @@ namespace FreeSql.Internal
var valueExp = Expression.Variable(typeof(object), "locvalue"); var valueExp = Expression.Variable(typeof(object), "locvalue");
Func<Expression> funcGetExpression = () => Func<Expression> funcGetExpression = () =>
{ {
if (type.FullName == "System.Byte[]") return Expression.Return(returnTarget, valueExp); if (type.FullName == "System.Byte[]") return Expression.IfThenElse(
Expression.TypeEqual(valueExp, type),
Expression.Return(returnTarget, valueExp),
Expression.IfThenElse(
Expression.TypeEqual(valueExp, typeof(string)),
Expression.Return(returnTarget, Expression.Call(Expression.Constant(DefaultEncoding), MethodEncodingGetBytes, Expression.Convert(valueExp, typeof(string)))),
Expression.IfThenElse(
Expression.Or(Expression.TypeEqual(valueExp, typeof(Guid)), Expression.TypeEqual(valueExp, typeof(Guid?))),
Expression.Return(returnTarget, Expression.Call(MethodGuidToBytes, Expression.Convert(valueExp, typeof(Guid)))),
Expression.Return(returnTarget, Expression.Call(Expression.Constant(DefaultEncoding), MethodEncodingGetBytes, Expression.Call(MethodToString, valueExp)))
)
)
);
if (type.IsArray) if (type.IsArray)
{ {
var elementType = type.GetElementType(); var elementType = type.GetElementType();
@ -1911,7 +1941,8 @@ namespace FreeSql.Internal
Expression callToStringExp = Expression.Return(returnTarget, Expression.Convert(Expression.Call(MethodToString, valueExp), typeof(object))); Expression callToStringExp = Expression.Return(returnTarget, Expression.Convert(Expression.Call(MethodToString, valueExp), typeof(object)));
foreach (var toStringFunc in GetDataReaderValueBlockExpressionObjectToStringIfThenElse) foreach (var toStringFunc in GetDataReaderValueBlockExpressionObjectToStringIfThenElse)
callToStringExp = toStringFunc(returnTarget, valueExp, callToStringExp, type); callToStringExp = toStringFunc(returnTarget, valueExp, callToStringExp, type);
Expression switchExp = null; Expression switchExp = Expression.Return(returnTarget, Expression.Call(MethodConvertChangeType, valueExp, Expression.Constant(type, typeof(Type))));
Expression defaultRetExp = switchExp;
if (tryparseExp != null) if (tryparseExp != null)
switchExp = Expression.Switch( switchExp = Expression.Switch(
Expression.Constant(type), Expression.Constant(type),
@ -1921,23 +1952,15 @@ namespace FreeSql.Internal
Expression.Constant(typeof(byte)), Expression.Constant(typeof(ushort)), Expression.Constant(typeof(uint)), Expression.Constant(typeof(ulong)), Expression.Constant(typeof(byte)), Expression.Constant(typeof(ushort)), Expression.Constant(typeof(uint)), Expression.Constant(typeof(ulong)),
Expression.Constant(typeof(double)), Expression.Constant(typeof(float)), Expression.Constant(typeof(decimal)), Expression.Constant(typeof(double)), Expression.Constant(typeof(float)), Expression.Constant(typeof(decimal)),
Expression.Constant(typeof(DateTime)), Expression.Constant(typeof(DateTimeOffset)) Expression.Constant(typeof(DateTime)), Expression.Constant(typeof(DateTimeOffset))
), )
Expression.SwitchCase(Expression.Return(returnTarget, Expression.Call(MethodConvertChangeType, valueExp, Expression.Constant(type, typeof(Type)))), Expression.Constant(type))
); );
else if (tryparseBooleanExp != null) else if (tryparseBooleanExp != null)
switchExp = Expression.Switch( switchExp = Expression.Switch(
Expression.Constant(type), Expression.Constant(type),
Expression.SwitchCase(tryparseBooleanExp, Expression.Constant(typeof(bool))), Expression.SwitchCase(tryparseBooleanExp, Expression.Constant(typeof(bool)))
Expression.SwitchCase(Expression.Return(returnTarget, Expression.Call(MethodConvertChangeType, valueExp, Expression.Constant(type, typeof(Type)))), Expression.Constant(type))
); );
else if (type == typeof(string)) else if (type == typeof(string))
switchExp = callToStringExp; defaultRetExp = switchExp = callToStringExp;
else
switchExp = Expression.Return(returnTarget, Expression.Call(MethodConvertChangeType, valueExp, Expression.Constant(type, typeof(Type))));
var defaultRetExp = type == typeof(string) ?
callToStringExp :
Expression.Return(returnTarget, Expression.Call(MethodConvertChangeType, valueExp, Expression.Constant(type, typeof(Type))));
return Expression.IfThenElse( return Expression.IfThenElse(
Expression.TypeEqual(valueExp, type), Expression.TypeEqual(valueExp, type),
@ -1952,8 +1975,20 @@ namespace FreeSql.Internal
Expression.AndAlso(Expression.Equal(Expression.Constant(type), Expression.Constant(typeof(DateTimeOffset))), Expression.TypeEqual(valueExp, typeof(DateTime))), Expression.AndAlso(Expression.Equal(Expression.Constant(type), Expression.Constant(typeof(DateTimeOffset))), Expression.TypeEqual(valueExp, typeof(DateTime))),
Expression.Return(returnTarget, Expression.Convert( Expression.Return(returnTarget, Expression.Convert(
Expression.New(CtorDateTimeOffsetArgsTicks, Expression.MakeMemberAccess(Expression.Convert(valueExp, typeof(DateTime)), PropertyDateTimeTicks), Expression.Constant(TimeSpan.Zero)), typeof(object))), Expression.New(CtorDateTimeOffsetArgsTicks, Expression.MakeMemberAccess(Expression.Convert(valueExp, typeof(DateTime)), PropertyDateTimeTicks), Expression.Constant(TimeSpan.Zero)), typeof(object))),
Expression.IfThenElse(
Expression.TypeEqual(valueExp, typeof(byte[])),
Expression.IfThenElse(
Expression.Or(Expression.Equal(Expression.Constant(type), Expression.Constant(typeof(Guid))), Expression.Equal(Expression.Constant(type), Expression.Constant(typeof(Guid?)))),
Expression.Return(returnTarget, Expression.Convert(Expression.Call(MethodBytesToGuid, Expression.Convert(valueExp, typeof(byte[]))), typeof(object))),
Expression.IfThenElse(
Expression.Equal(Expression.Constant(type), Expression.Constant(typeof(string))),
Expression.Return(returnTarget, Expression.Convert(Expression.Call(Expression.Constant(DefaultEncoding), MethodEncodingGetString, Expression.Convert(valueExp, typeof(byte[]))), typeof(object))),
defaultRetExp defaultRetExp
) )
),
defaultRetExp
)
)
) )
) )
); );

View File

@ -39,6 +39,7 @@ namespace FreeSql.MsAccess
if (param == null) return "NULL"; if (param == null) return "NULL";
if (mapType != null && mapType != param.GetType() && (param is IEnumerable == false || mapType.IsArrayOrList())) if (mapType != null && mapType != param.GetType() && (param is IEnumerable == false || mapType.IsArrayOrList()))
param = Utils.GetDataReaderValue(mapType, param); param = Utils.GetDataReaderValue(mapType, param);
if (param is bool || param is bool?) if (param is bool || param is bool?)
return (bool)param ? -1 : 0; return (bool)param ? -1 : 0;
else if (param is string || param is char) else if (param is string || param is char)
@ -54,6 +55,8 @@ namespace FreeSql.MsAccess
} }
else if (param is TimeSpan || param is TimeSpan?) else if (param is TimeSpan || param is TimeSpan?)
return ((TimeSpan)param).TotalSeconds; return ((TimeSpan)param).TotalSeconds;
else if (param is byte[])
return $"0x{CommonUtils.BytesSqlRaw(param as byte[])}";
else if (param is IEnumerable) else if (param is IEnumerable)
return AddslashesIEnumerable(param, mapType, mapColumn); return AddslashesIEnumerable(param, mapType, mapColumn);

View File

@ -80,15 +80,8 @@ namespace FreeSql.MsAccess
public override string GetNoneParamaterSqlValue(List<DbParameter> specialParams, Type type, object value) public override string GetNoneParamaterSqlValue(List<DbParameter> specialParams, Type type, object value)
{ {
if (value == null) return "NULL"; if (value == null) return "NULL";
if (type == typeof(byte[])) if (type == typeof(byte[])) return $"0x{CommonUtils.BytesSqlRaw(value as byte[])}";
{ if (type == typeof(TimeSpan) || type == typeof(TimeSpan?))
var bytes = value as byte[];
var sb = new StringBuilder().Append("0x");
foreach (var vc in bytes)
sb.Append(vc.ToString("X").PadLeft(2, '0'));
return sb.ToString();
}
else if (type == typeof(TimeSpan) || type == typeof(TimeSpan?))
{ {
var ts = (TimeSpan)value; var ts = (TimeSpan)value;
value = $"{ts.Hours}:{ts.Minutes}:{ts.Seconds}"; value = $"{ts.Hours}:{ts.Minutes}:{ts.Seconds}";

View File

@ -38,6 +38,7 @@ namespace FreeSql.MySql
if (param == null) return "NULL"; if (param == null) return "NULL";
if (mapType != null && mapType != param.GetType() && (param is IEnumerable == false || mapType.IsArrayOrList())) if (mapType != null && mapType != param.GetType() && (param is IEnumerable == false || mapType.IsArrayOrList()))
param = Utils.GetDataReaderValue(mapType, param); param = Utils.GetDataReaderValue(mapType, param);
if (param is bool || param is bool?) if (param is bool || param is bool?)
return (bool)param ? 1 : 0; return (bool)param ? 1 : 0;
else if (param is string || param is char) else if (param is string || param is char)
@ -50,6 +51,8 @@ namespace FreeSql.MySql
return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.fff"), "'"); return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.fff"), "'");
else if (param is TimeSpan || param is TimeSpan?) else if (param is TimeSpan || param is TimeSpan?)
return ((TimeSpan)param).Ticks / 10; return ((TimeSpan)param).Ticks / 10;
else if (param is byte[])
return $"0x{CommonUtils.BytesSqlRaw(param as byte[])}";
else if (param is MygisGeometry) else if (param is MygisGeometry)
return string.Concat("ST_GeomFromText('", (param as MygisGeometry).AsText().Replace("'", "''"), "')"); return string.Concat("ST_GeomFromText('", (param as MygisGeometry).AsText().Replace("'", "''"), "')");
else if (param is IEnumerable) else if (param is IEnumerable)

View File

@ -121,15 +121,8 @@ namespace FreeSql.MySql
public override string GetNoneParamaterSqlValue(List<DbParameter> specialParams, Type type, object value) public override string GetNoneParamaterSqlValue(List<DbParameter> specialParams, Type type, object value)
{ {
if (value == null) return "NULL"; if (value == null) return "NULL";
if (type == typeof(byte[])) if (type == typeof(byte[])) return $"0x{CommonUtils.BytesSqlRaw(value as byte[])}";
{ if (type == typeof(TimeSpan) || type == typeof(TimeSpan?))
var bytes = value as byte[];
var sb = new StringBuilder().Append("0x");
foreach (var vc in bytes)
sb.Append(vc.ToString("X").PadLeft(2, '0'));
return sb.ToString(); //val = Encoding.UTF8.GetString(val as byte[]);
}
else if (type == typeof(TimeSpan) || type == typeof(TimeSpan?))
{ {
var ts = (TimeSpan)value; var ts = (TimeSpan)value;
value = $"{Math.Floor(ts.TotalHours)}:{ts.Minutes}:{ts.Seconds}"; value = $"{Math.Floor(ts.TotalHours)}:{ts.Minutes}:{ts.Seconds}";

View File

@ -129,15 +129,8 @@ namespace FreeSql.MySql
public override string GetNoneParamaterSqlValue(List<DbParameter> specialParams, Type type, object value) public override string GetNoneParamaterSqlValue(List<DbParameter> specialParams, Type type, object value)
{ {
if (value == null) return "NULL"; if (value == null) return "NULL";
if (type == typeof(byte[])) if (type == typeof(byte[])) return $"0x{CommonUtils.BytesSqlRaw(value as byte[])}";
{ if (type == typeof(TimeSpan) || type == typeof(TimeSpan?))
var bytes = value as byte[];
var sb = new StringBuilder().Append("0x");
foreach (var vc in bytes)
sb.Append(vc.ToString("X").PadLeft(2, '0'));
return sb.ToString(); //val = Encoding.UTF8.GetString(val as byte[]);
}
else if (type == typeof(TimeSpan) || type == typeof(TimeSpan?))
{ {
var ts = (TimeSpan)value; var ts = (TimeSpan)value;
value = $"{Math.Floor(ts.TotalHours)}:{ts.Minutes}:{ts.Seconds}"; value = $"{Math.Floor(ts.TotalHours)}:{ts.Minutes}:{ts.Seconds}";

View File

@ -37,7 +37,10 @@ namespace FreeSql.Odbc.Dameng
if (param == null) return "NULL"; if (param == null) return "NULL";
if (mapType != null && mapType != param.GetType() && (param is IEnumerable == false || mapType.IsArrayOrList())) if (mapType != null && mapType != param.GetType() && (param is IEnumerable == false || mapType.IsArrayOrList()))
param = Utils.GetDataReaderValue(mapType, param); param = Utils.GetDataReaderValue(mapType, param);
if (param is bool || param is bool?)
if (param is byte[])
return $"hextoraw('{CommonUtils.BytesSqlRaw(param as byte[])}')";
else if (param is bool || param is bool?)
return (bool)param ? 1 : 0; return (bool)param ? 1 : 0;
else if (param is string || param is char) else if (param is string || param is char)
return string.Concat("'", param.ToString().Replace("'", "''"), "'"); return string.Concat("'", param.ToString().Replace("'", "''"), "'");

View File

@ -41,7 +41,7 @@ namespace FreeSql.Odbc.Dameng
case "System.UInt16": case "System.UInt16":
case "System.UInt32": case "System.UInt32":
case "System.UInt64": return $"cast({getExp(operandExp)} as number)"; case "System.UInt64": return $"cast({getExp(operandExp)} as number)";
case "System.Guid": return $"substr(to_char({getExp(operandExp)}), 1, 36)"; case "System.Guid": return $"to_char({getExp(operandExp)})";
} }
} }
break; break;

View File

@ -96,14 +96,7 @@ namespace FreeSql.Odbc.Dameng
public override string GetNoneParamaterSqlValue(List<DbParameter> specialParams, Type type, object value) public override string GetNoneParamaterSqlValue(List<DbParameter> specialParams, Type type, object value)
{ {
if (value == null) return "NULL"; if (value == null) return "NULL";
if (type == typeof(byte[])) if (type == typeof(byte[])) return $"hextoraw('{CommonUtils.BytesSqlRaw(value as byte[])}')";
{
var bytes = value as byte[];
var sb = new StringBuilder().Append("rawtohex('0x");
foreach (var vc in bytes)
sb.Append(vc.ToString("X").PadLeft(2, '0'));
return sb.Append("')").ToString();
}
return FormatSql("{0}", value, 1); return FormatSql("{0}", value, 1);
} }
} }

View File

@ -1,4 +1,5 @@
using FreeSql.Internal.Model; using FreeSql.Internal;
using FreeSql.Internal.Model;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text; using System.Text;
@ -55,11 +56,7 @@ namespace FreeSql.Odbc.Default
public virtual string ByteRawSql(object value) public virtual string ByteRawSql(object value)
{ {
if (value == null) return "NULL"; if (value == null) return "NULL";
var bytes = value as byte[]; return $"0x{CommonUtils.BytesSqlRaw(value as byte[])}";
var sb = new StringBuilder().Append("0x");
foreach (var vc in bytes)
sb.Append(vc.ToString("X").PadLeft(2, '0'));
return sb.ToString();
} }
public virtual string CastSql(string sql, string to) => $"cast({sql} as {to})"; public virtual string CastSql(string sql, string to) => $"cast({sql} as {to})";

View File

@ -39,6 +39,7 @@ namespace FreeSql.Odbc.Default
if (param == null) return "NULL"; if (param == null) return "NULL";
if (mapType != null && mapType != param.GetType() && (param is IEnumerable == false || mapType.IsArrayOrList())) if (mapType != null && mapType != param.GetType() && (param is IEnumerable == false || mapType.IsArrayOrList()))
param = Utils.GetDataReaderValue(mapType, param); param = Utils.GetDataReaderValue(mapType, param);
if (param is bool || param is bool?) 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)
@ -53,6 +54,8 @@ namespace FreeSql.Odbc.Default
return Adapter.DateTimeRawSql(param); return Adapter.DateTimeRawSql(param);
else if (param is TimeSpan || param is TimeSpan?) else if (param is TimeSpan || param is TimeSpan?)
return Adapter.TimeSpanRawSql(param); return Adapter.TimeSpanRawSql(param);
else if (param is byte[])
return Adapter.ByteRawSql(param as byte[]);
else if (param is IEnumerable) else if (param is IEnumerable)
return AddslashesIEnumerable(param, mapType, mapColumn); return AddslashesIEnumerable(param, mapType, mapColumn);

View File

@ -51,6 +51,8 @@ namespace FreeSql.Odbc.GBase
return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'"); return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'");
else if (param is TimeSpan || param is TimeSpan?) else if (param is TimeSpan || param is TimeSpan?)
return ((TimeSpan)param).Ticks / 10; return ((TimeSpan)param).Ticks / 10;
else if (param is byte[])
return $"'\\x{CommonUtils.BytesSqlRaw(param as byte[])}'";
else if (param is IEnumerable) else if (param is IEnumerable)
return AddslashesIEnumerable(param, mapType, mapColumn); return AddslashesIEnumerable(param, mapType, mapColumn);

View File

@ -124,15 +124,8 @@ namespace FreeSql.Odbc.GBase
if (value == null) return "NULL"; if (value == null) return "NULL";
value = getParamterValue(type, value); value = getParamterValue(type, value);
var type2 = value.GetType(); var type2 = value.GetType();
if (type2 == typeof(byte[])) if (type2 == typeof(byte[])) return $"'\\x{CommonUtils.BytesSqlRaw(value as byte[])}'";
{ if (type2 == typeof(TimeSpan) || type2 == typeof(TimeSpan?))
var bytes = value as byte[];
var sb = new StringBuilder().Append("'\\x");
foreach (var vc in bytes)
sb.Append(vc.ToString("X").PadLeft(2, '0'));
return sb.Append("'").ToString(); //val = Encoding.UTF8.GetString(val as byte[]);
}
else if (type2 == typeof(TimeSpan) || type2 == typeof(TimeSpan?))
{ {
var ts = (TimeSpan)value; var ts = (TimeSpan)value;
return $"'{Math.Min(24, (int)Math.Floor(ts.TotalHours))}:{ts.Minutes}:{ts.Seconds}'"; return $"'{Math.Min(24, (int)Math.Floor(ts.TotalHours))}:{ts.Minutes}:{ts.Seconds}'";

View File

@ -38,6 +38,7 @@ namespace FreeSql.Odbc.MySql
if (param == null) return "NULL"; if (param == null) return "NULL";
if (mapType != null && mapType != param.GetType() && (param is IEnumerable == false || mapType.IsArrayOrList())) if (mapType != null && mapType != param.GetType() && (param is IEnumerable == false || mapType.IsArrayOrList()))
param = Utils.GetDataReaderValue(mapType, param); param = Utils.GetDataReaderValue(mapType, param);
if (param is bool || param is bool?) if (param is bool || param is bool?)
return (bool)param ? 1 : 0; return (bool)param ? 1 : 0;
else if (param is string || param is char) else if (param is string || param is char)
@ -50,6 +51,8 @@ namespace FreeSql.Odbc.MySql
return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.fff"), "'"); return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.fff"), "'");
else if (param is TimeSpan || param is TimeSpan?) else if (param is TimeSpan || param is TimeSpan?)
return ((TimeSpan)param).Ticks / 10; return ((TimeSpan)param).Ticks / 10;
else if (param is byte[])
return $"0x{CommonUtils.BytesSqlRaw(param as byte[])}";
else if (param is IEnumerable) else if (param is IEnumerable)
return AddslashesIEnumerable(param, mapType, mapColumn); return AddslashesIEnumerable(param, mapType, mapColumn);

View File

@ -92,15 +92,8 @@ namespace FreeSql.Odbc.MySql
public override string GetNoneParamaterSqlValue(List<DbParameter> specialParams, Type type, object value) public override string GetNoneParamaterSqlValue(List<DbParameter> specialParams, Type type, object value)
{ {
if (value == null) return "NULL"; if (value == null) return "NULL";
if (type == typeof(byte[])) if (type == typeof(byte[])) return $"0x{CommonUtils.BytesSqlRaw(value as byte[])}";
{ if (type == typeof(TimeSpan) || type == typeof(TimeSpan?))
var bytes = value as byte[];
var sb = new StringBuilder().Append("0x");
foreach (var vc in bytes)
sb.Append(vc.ToString("X").PadLeft(2, '0'));
return sb.ToString(); //val = Encoding.UTF8.GetString(val as byte[]);
}
else if (type == typeof(TimeSpan) || type == typeof(TimeSpan?))
{ {
var ts = (TimeSpan)value; var ts = (TimeSpan)value;
value = $"{Math.Floor(ts.TotalHours)}:{ts.Minutes}:{ts.Seconds}"; value = $"{Math.Floor(ts.TotalHours)}:{ts.Minutes}:{ts.Seconds}";

View File

@ -37,7 +37,10 @@ namespace FreeSql.Odbc.Oracle
if (param == null) return "NULL"; if (param == null) return "NULL";
if (mapType != null && mapType != param.GetType() && (param is IEnumerable == false || mapType.IsArrayOrList())) if (mapType != null && mapType != param.GetType() && (param is IEnumerable == false || mapType.IsArrayOrList()))
param = Utils.GetDataReaderValue(mapType, param); param = Utils.GetDataReaderValue(mapType, param);
if (param is bool || param is bool?)
if (param is byte[])
return $"hextoraw('{CommonUtils.BytesSqlRaw(param as byte[])}')";
else if (param is bool || param is bool?)
return (bool)param ? 1 : 0; return (bool)param ? 1 : 0;
else if (param is string || param is char) else if (param is string || param is char)
return string.Concat("'", param.ToString().Replace("'", "''"), "'"); return string.Concat("'", param.ToString().Replace("'", "''"), "'");

View File

@ -41,7 +41,7 @@ namespace FreeSql.Odbc.Oracle
case "System.UInt16": case "System.UInt16":
case "System.UInt32": case "System.UInt32":
case "System.UInt64": return $"cast({getExp(operandExp)} as number)"; case "System.UInt64": return $"cast({getExp(operandExp)} as number)";
case "System.Guid": return $"substr(to_char({getExp(operandExp)}), 1, 36)"; case "System.Guid": return $"to_char({getExp(operandExp)})";
} }
} }
break; break;

View File

@ -96,14 +96,7 @@ namespace FreeSql.Odbc.Oracle
public override string GetNoneParamaterSqlValue(List<DbParameter> specialParams, Type type, object value) public override string GetNoneParamaterSqlValue(List<DbParameter> specialParams, Type type, object value)
{ {
if (value == null) return "NULL"; if (value == null) return "NULL";
if (type == typeof(byte[])) if (type == typeof(byte[])) return $"hextoraw('{CommonUtils.BytesSqlRaw(value as byte[])}')";
{
var bytes = value as byte[];
var sb = new StringBuilder().Append("rawtohex('0x");
foreach (var vc in bytes)
sb.Append(vc.ToString("X").PadLeft(2, '0'));
return sb.Append("')").ToString();
}
return FormatSql("{0}", value, 1); return FormatSql("{0}", value, 1);
} }
} }

View File

@ -39,6 +39,7 @@ namespace FreeSql.Odbc.PostgreSQL
if (param == null) return "NULL"; if (param == null) return "NULL";
if (mapType != null && mapType != param.GetType() && (param is IEnumerable == false || mapType.IsArrayOrList())) if (mapType != null && mapType != param.GetType() && (param is IEnumerable == false || mapType.IsArrayOrList()))
param = Utils.GetDataReaderValue(mapType, param); param = Utils.GetDataReaderValue(mapType, param);
if (param is bool || param is bool?) if (param is bool || param is bool?)
return (bool)param ? "'t'" : "'f'"; return (bool)param ? "'t'" : "'f'";
else if (param is string || param is char) else if (param is string || param is char)
@ -51,6 +52,8 @@ namespace FreeSql.Odbc.PostgreSQL
return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'"); return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'");
else if (param is TimeSpan || param is TimeSpan?) else if (param is TimeSpan || param is TimeSpan?)
return ((TimeSpan)param).Ticks / 10; return ((TimeSpan)param).Ticks / 10;
else if (param is byte[])
return $"'\\x{CommonUtils.BytesSqlRaw(param as byte[])}'";
else if (param is IEnumerable) else if (param is IEnumerable)
return AddslashesIEnumerable(param, mapType, mapColumn); return AddslashesIEnumerable(param, mapType, mapColumn);

View File

@ -124,15 +124,8 @@ namespace FreeSql.Odbc.PostgreSQL
if (value == null) return "NULL"; if (value == null) return "NULL";
value = getParamterValue(type, value); value = getParamterValue(type, value);
var type2 = value.GetType(); var type2 = value.GetType();
if (type2 == typeof(byte[])) if (type2 == typeof(byte[])) return $"'\\x{CommonUtils.BytesSqlRaw(value as byte[])}'";
{ if (type2 == typeof(TimeSpan) || type2 == typeof(TimeSpan?))
var bytes = value as byte[];
var sb = new StringBuilder().Append("'\\x");
foreach (var vc in bytes)
sb.Append(vc.ToString("X").PadLeft(2, '0'));
return sb.Append("'").ToString(); //val = Encoding.UTF8.GetString(val as byte[]);
}
else if (type2 == typeof(TimeSpan) || type2 == typeof(TimeSpan?))
{ {
var ts = (TimeSpan)value; var ts = (TimeSpan)value;
return $"'{Math.Min(24, (int)Math.Floor(ts.TotalHours))}:{ts.Minutes}:{ts.Seconds}'"; return $"'{Math.Min(24, (int)Math.Floor(ts.TotalHours))}:{ts.Minutes}:{ts.Seconds}'";

View File

@ -40,6 +40,7 @@ namespace FreeSql.Odbc.SqlServer
if (param == null) return "NULL"; if (param == null) return "NULL";
if (mapType != null && mapType != param.GetType() && (param is IEnumerable == false || mapType.IsArrayOrList())) if (mapType != null && mapType != param.GetType() && (param is IEnumerable == false || mapType.IsArrayOrList()))
param = Utils.GetDataReaderValue(mapType, param); param = Utils.GetDataReaderValue(mapType, param);
if (param is bool || param is bool?) 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)
@ -66,6 +67,8 @@ namespace FreeSql.Odbc.SqlServer
} }
else if (param is TimeSpan || param is TimeSpan?) else if (param is TimeSpan || param is TimeSpan?)
return ((TimeSpan)param).TotalSeconds; return ((TimeSpan)param).TotalSeconds;
else if (param is byte[])
return $"0x{CommonUtils.BytesSqlRaw(param as byte[])}";
else if (param is IEnumerable) else if (param is IEnumerable)
return AddslashesIEnumerable(param, mapType, mapColumn); return AddslashesIEnumerable(param, mapType, mapColumn);

View File

@ -83,15 +83,8 @@ namespace FreeSql.Odbc.SqlServer
public override string GetNoneParamaterSqlValue(List<DbParameter> specialParams, Type type, object value) public override string GetNoneParamaterSqlValue(List<DbParameter> specialParams, Type type, object value)
{ {
if (value == null) return "NULL"; if (value == null) return "NULL";
if (type == typeof(byte[])) if (type == typeof(byte[])) return $"0x{CommonUtils.BytesSqlRaw(value as byte[])}";
{ if (type == typeof(TimeSpan) || type == typeof(TimeSpan?))
var bytes = value as byte[];
var sb = new StringBuilder().Append("0x");
foreach (var vc in bytes)
sb.Append(vc.ToString("X").PadLeft(2, '0'));
return sb.ToString();
}
else if (type == typeof(TimeSpan) || type == typeof(TimeSpan?))
{ {
var ts = (TimeSpan)value; var ts = (TimeSpan)value;
value = $"{ts.Hours}:{ts.Minutes}:{ts.Seconds}.{ts.Milliseconds}"; value = $"{ts.Hours}:{ts.Minutes}:{ts.Seconds}.{ts.Milliseconds}";

View File

@ -37,7 +37,10 @@ namespace FreeSql.Oracle
if (param == null) return "NULL"; if (param == null) return "NULL";
if (mapType != null && mapType != param.GetType() && (param is IEnumerable == false || mapType.IsArrayOrList())) if (mapType != null && mapType != param.GetType() && (param is IEnumerable == false || mapType.IsArrayOrList()))
param = Utils.GetDataReaderValue(mapType, param); param = Utils.GetDataReaderValue(mapType, param);
if (param is bool || param is bool?)
if (param is byte[])
return $"hextoraw('{CommonUtils.BytesSqlRaw(param as byte[])}')";
else if (param is bool || param is bool?)
return (bool)param ? 1 : 0; return (bool)param ? 1 : 0;
else if (param is string || param is char) else if (param is string || param is char)
return string.Concat("'", param.ToString().Replace("'", "''"), "'"); return string.Concat("'", param.ToString().Replace("'", "''"), "'");

View File

@ -68,7 +68,7 @@ namespace FreeSql.Oracle
case "System.UInt16": case "System.UInt16":
case "System.UInt32": case "System.UInt32":
case "System.UInt64": return $"cast({getExp(callExp.Arguments[0])} as number)"; case "System.UInt64": return $"cast({getExp(callExp.Arguments[0])} as number)";
case "System.Guid": return $"substr(to_char({getExp(callExp.Arguments[0])}), 1, 36)"; case "System.Guid": return $"to_char({getExp(callExp.Arguments[0])})";
} }
return null; return null;
case "NewGuid": case "NewGuid":

View File

@ -91,14 +91,7 @@ namespace FreeSql.Oracle
public override string GetNoneParamaterSqlValue(List<DbParameter> specialParams, Type type, object value) public override string GetNoneParamaterSqlValue(List<DbParameter> specialParams, Type type, object value)
{ {
if (value == null) return "NULL"; if (value == null) return "NULL";
if (type == typeof(byte[])) if (type == typeof(byte[])) return $"hextoraw('{CommonUtils.BytesSqlRaw(value as byte[])}')";
{
var bytes = value as byte[];
var sb = new StringBuilder().Append("rawtohex('0x");
foreach (var vc in bytes)
sb.Append(vc.ToString("X").PadLeft(2, '0'));
return sb.Append("')").ToString();
}
return FormatSql("{0}", value, 1); return FormatSql("{0}", value, 1);
} }
} }

View File

@ -40,6 +40,7 @@ namespace FreeSql.PostgreSQL
if (param == null) return "NULL"; if (param == null) return "NULL";
if (mapType != null && mapType != param.GetType() && (param is IEnumerable == false || mapType.IsArrayOrList() || param is JToken || param is JObject || param is JArray)) if (mapType != null && mapType != param.GetType() && (param is IEnumerable == false || mapType.IsArrayOrList() || param is JToken || param is JObject || param is JArray))
param = Utils.GetDataReaderValue(mapType, param); param = Utils.GetDataReaderValue(mapType, param);
bool isdic; bool isdic;
if (param is bool || param is bool?) if (param is bool || param is bool?)
return (bool)param ? "'t'" : "'f'"; return (bool)param ? "'t'" : "'f'";
@ -53,6 +54,8 @@ namespace FreeSql.PostgreSQL
return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'"); return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'");
else if (param is TimeSpan || param is TimeSpan?) else if (param is TimeSpan || param is TimeSpan?)
return ((TimeSpan)param).Ticks / 10; return ((TimeSpan)param).Ticks / 10;
else if (param is byte[])
return $"'\\x{CommonUtils.BytesSqlRaw(param as byte[])}'";
else if (param is JToken || param is JObject || param is JArray) else if (param is JToken || param is JObject || param is JArray)
return string.Concat("'", param.ToString().Replace("'", "''"), "'::jsonb"); return string.Concat("'", param.ToString().Replace("'", "''"), "'::jsonb");
else if ((isdic = param is Dictionary<string, string>) || else if ((isdic = param is Dictionary<string, string>) ||

View File

@ -156,15 +156,8 @@ namespace FreeSql.PostgreSQL
} }
value = getParamterValue(type, value); value = getParamterValue(type, value);
var type2 = value.GetType(); var type2 = value.GetType();
if (type2 == typeof(byte[])) if (type2 == typeof(byte[])) return $"'\\x{CommonUtils.BytesSqlRaw(value as byte[])}'";
{ if (type2 == typeof(TimeSpan) || type2 == typeof(TimeSpan?))
var bytes = value as byte[];
var sb = new StringBuilder().Append("'\\x");
foreach (var vc in bytes)
sb.Append(vc.ToString("X").PadLeft(2, '0'));
return sb.Append("'").ToString(); //val = Encoding.UTF8.GetString(val as byte[]);
}
else if (type2 == typeof(TimeSpan) || type2 == typeof(TimeSpan?))
{ {
var ts = (TimeSpan)value; var ts = (TimeSpan)value;
return $"'{Math.Min(24, (int)Math.Floor(ts.TotalHours))}:{ts.Minutes}:{ts.Seconds}'"; return $"'{Math.Min(24, (int)Math.Floor(ts.TotalHours))}:{ts.Minutes}:{ts.Seconds}'";

View File

@ -41,6 +41,7 @@ namespace FreeSql.SqlServer
if (param == null) return "NULL"; if (param == null) return "NULL";
if (mapType != null && mapType != param.GetType() && (param is IEnumerable == false || mapType.IsArrayOrList())) if (mapType != null && mapType != param.GetType() && (param is IEnumerable == false || mapType.IsArrayOrList()))
param = Utils.GetDataReaderValue(mapType, param); param = Utils.GetDataReaderValue(mapType, param);
if (param is bool || param is bool?) 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)
@ -67,6 +68,8 @@ namespace FreeSql.SqlServer
} }
else if (param is TimeSpan || param is TimeSpan?) else if (param is TimeSpan || param is TimeSpan?)
return ((TimeSpan)param).TotalSeconds; return ((TimeSpan)param).TotalSeconds;
else if (param is byte[])
return $"0x{CommonUtils.BytesSqlRaw(param as byte[])}";
else if (param is IEnumerable) else if (param is IEnumerable)
return AddslashesIEnumerable(param, mapType, mapColumn); return AddslashesIEnumerable(param, mapType, mapColumn);

View File

@ -94,15 +94,8 @@ namespace FreeSql.SqlServer
public override string GetNoneParamaterSqlValue(List<DbParameter> specialParams, Type type, object value) public override string GetNoneParamaterSqlValue(List<DbParameter> specialParams, Type type, object value)
{ {
if (value == null) return "NULL"; if (value == null) return "NULL";
if (type == typeof(byte[])) if (type == typeof(byte[])) return $"0x{CommonUtils.BytesSqlRaw(value as byte[])}";
{ if (type == typeof(TimeSpan) || type == typeof(TimeSpan?))
var bytes = value as byte[];
var sb = new StringBuilder().Append("0x");
foreach (var vc in bytes)
sb.Append(vc.ToString("X").PadLeft(2, '0'));
return sb.ToString();
}
else if (type == typeof(TimeSpan) || type == typeof(TimeSpan?))
{ {
var ts = (TimeSpan)value; var ts = (TimeSpan)value;
value = $"{ts.Hours}:{ts.Minutes}:{ts.Seconds}.{ts.Milliseconds}"; value = $"{ts.Hours}:{ts.Minutes}:{ts.Seconds}.{ts.Milliseconds}";

View File

@ -36,6 +36,7 @@ namespace FreeSql.Sqlite
if (param == null) return "NULL"; if (param == null) return "NULL";
if (mapType != null && mapType != param.GetType() && (param is IEnumerable == false || mapType.IsArrayOrList())) if (mapType != null && mapType != param.GetType() && (param is IEnumerable == false || mapType.IsArrayOrList()))
param = Utils.GetDataReaderValue(mapType, param); param = Utils.GetDataReaderValue(mapType, param);
if (param is bool || param is bool?) if (param is bool || param is bool?)
return (bool)param ? 1 : 0; return (bool)param ? 1 : 0;
else if (param is string || param is char) else if (param is string || param is char)
@ -48,6 +49,8 @@ namespace FreeSql.Sqlite
return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss"), "'"); return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss"), "'");
else if (param is TimeSpan || param is TimeSpan?) else if (param is TimeSpan || param is TimeSpan?)
return ((TimeSpan)param).Ticks / 10000; return ((TimeSpan)param).Ticks / 10000;
else if (param is byte[])
return string.Concat("'", Encoding.UTF8.GetString(param as byte[]), "'");
else if (param is IEnumerable) else if (param is IEnumerable)
return AddslashesIEnumerable(param, mapType, mapColumn); return AddslashesIEnumerable(param, mapType, mapColumn);

View File

@ -94,7 +94,6 @@ namespace FreeSql.Sqlite
public override string GetNoneParamaterSqlValue(List<DbParameter> specialParams, Type type, object value) public override string GetNoneParamaterSqlValue(List<DbParameter> specialParams, Type type, object value)
{ {
if (value == null) return "NULL"; if (value == null) return "NULL";
if (type == typeof(byte[])) value = Encoding.UTF8.GetString(value as byte[]);
return FormatSql("{0}", value, 1); return FormatSql("{0}", value, 1);
} }
} }