diff --git a/FreeSql.Tests/FreeSql.Tests/UnitTest3.cs b/FreeSql.Tests/FreeSql.Tests/UnitTest3.cs index 4f3cd9f9..df158e9a 100644 --- a/FreeSql.Tests/FreeSql.Tests/UnitTest3.cs +++ b/FreeSql.Tests/FreeSql.Tests/UnitTest3.cs @@ -108,12 +108,14 @@ namespace FreeSql.Tests .NoneParameter().ExecuteAffrows(); var slslsl = g.oracle.Select().ToList(); + var slsld1 = g.oracle.Select().Where(a => a.ID == Guid.Parse("8D9C135E7FEBC41C00BE241C1771FF97")).ToList(); + var slsld2 = g.oracle.Select().Where(a => a.ID == slsld1[0].ID).ToList(); } [Table(Name = "t_text")] public class SendInfo { - [Column(IsPrimary = true)] + [Column(IsPrimary = true, DbType = "raw(16)", MapType = typeof(byte[]))] public Guid ID { get; set; } [Column(Name = "YPID5")] diff --git a/FreeSql/Internal/CommonUtils.cs b/FreeSql/Internal/CommonUtils.cs index 46ab536c..4096acda 100644 --- a/FreeSql/Internal/CommonUtils.cs +++ b/FreeSql/Internal/CommonUtils.cs @@ -40,6 +40,12 @@ namespace FreeSql.Internal public abstract string QuoteReadColumn(Type type, Type mapType, string columnName); 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 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 ICodeFirst CodeFirst => _orm.CodeFirst; diff --git a/FreeSql/Internal/UtilsExpressionTree.cs b/FreeSql/Internal/UtilsExpressionTree.cs index 46aafb3e..8a52b7f6 100644 --- a/FreeSql/Internal/UtilsExpressionTree.cs +++ b/FreeSql/Internal/UtilsExpressionTree.cs @@ -188,7 +188,7 @@ namespace FreeSql.Internal //} 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.DbUpdateValue = colattr.ServerTime == DateTimeKind.Local ? common.Now : common.NowUtc; } @@ -1608,6 +1608,19 @@ namespace FreeSql.Internal if (obj == null) return null; 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>> _dicGetDataReaderValue = new ConcurrentDictionary>>(); 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 PropertyDateTimeTicks = typeof(DateTime).GetProperty("Ticks", BindingFlags.Instance | BindingFlags.Public); 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> GetDataReaderValueBlockExpressionSwitchTypeFullName = new ConcurrentBag>(); public static ConcurrentBag> GetDataReaderValueBlockExpressionObjectToStringIfThenElse = new ConcurrentBag>(); @@ -1644,7 +1662,19 @@ namespace FreeSql.Internal var valueExp = Expression.Variable(typeof(object), "locvalue"); Func 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) { var elementType = type.GetElementType(); @@ -1911,7 +1941,8 @@ namespace FreeSql.Internal Expression callToStringExp = Expression.Return(returnTarget, Expression.Convert(Expression.Call(MethodToString, valueExp), typeof(object))); foreach (var toStringFunc in GetDataReaderValueBlockExpressionObjectToStringIfThenElse) 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) switchExp = Expression.Switch( Expression.Constant(type), @@ -1921,24 +1952,16 @@ namespace FreeSql.Internal 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(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) switchExp = Expression.Switch( Expression.Constant(type), - Expression.SwitchCase(tryparseBooleanExp, Expression.Constant(typeof(bool))), - Expression.SwitchCase(Expression.Return(returnTarget, Expression.Call(MethodConvertChangeType, valueExp, Expression.Constant(type, typeof(Type)))), Expression.Constant(type)) + Expression.SwitchCase(tryparseBooleanExp, Expression.Constant(typeof(bool))) ); else if (type == typeof(string)) - switchExp = callToStringExp; - else - switchExp = Expression.Return(returnTarget, Expression.Call(MethodConvertChangeType, valueExp, Expression.Constant(type, typeof(Type)))); + defaultRetExp = switchExp = callToStringExp; - var defaultRetExp = type == typeof(string) ? - callToStringExp : - Expression.Return(returnTarget, Expression.Call(MethodConvertChangeType, valueExp, Expression.Constant(type, typeof(Type)))); - return Expression.IfThenElse( Expression.TypeEqual(valueExp, type), Expression.Return(returnTarget, valueExp), @@ -1952,7 +1975,19 @@ namespace FreeSql.Internal Expression.AndAlso(Expression.Equal(Expression.Constant(type), Expression.Constant(typeof(DateTimeOffset))), Expression.TypeEqual(valueExp, typeof(DateTime))), Expression.Return(returnTarget, Expression.Convert( Expression.New(CtorDateTimeOffsetArgsTicks, Expression.MakeMemberAccess(Expression.Convert(valueExp, typeof(DateTime)), PropertyDateTimeTicks), Expression.Constant(TimeSpan.Zero)), typeof(object))), - defaultRetExp + 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 + ) ) ) ) diff --git a/Providers/FreeSql.Provider.MsAccess/MsAccessAdo/MsAccessAdo.cs b/Providers/FreeSql.Provider.MsAccess/MsAccessAdo/MsAccessAdo.cs index 030b57a1..68d6022c 100644 --- a/Providers/FreeSql.Provider.MsAccess/MsAccessAdo/MsAccessAdo.cs +++ b/Providers/FreeSql.Provider.MsAccess/MsAccessAdo/MsAccessAdo.cs @@ -39,6 +39,7 @@ namespace FreeSql.MsAccess if (param == null) return "NULL"; if (mapType != null && mapType != param.GetType() && (param is IEnumerable == false || mapType.IsArrayOrList())) param = Utils.GetDataReaderValue(mapType, param); + if (param is bool || param is bool?) return (bool)param ? -1 : 0; else if (param is string || param is char) @@ -54,7 +55,9 @@ namespace FreeSql.MsAccess } else if (param is TimeSpan || param is TimeSpan?) return ((TimeSpan)param).TotalSeconds; - else if (param is IEnumerable) + else if (param is byte[]) + return $"0x{CommonUtils.BytesSqlRaw(param as byte[])}"; + else if (param is IEnumerable) return AddslashesIEnumerable(param, mapType, mapColumn); return string.Concat("'", param.ToString().Replace("'", "''"), "'"); diff --git a/Providers/FreeSql.Provider.MsAccess/MsAccessUtils.cs b/Providers/FreeSql.Provider.MsAccess/MsAccessUtils.cs index 125d7a60..cc5d50ee 100644 --- a/Providers/FreeSql.Provider.MsAccess/MsAccessUtils.cs +++ b/Providers/FreeSql.Provider.MsAccess/MsAccessUtils.cs @@ -80,15 +80,8 @@ namespace FreeSql.MsAccess public override string GetNoneParamaterSqlValue(List specialParams, Type type, object value) { if (value == null) return "NULL"; - if (type == typeof(byte[])) - { - 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?)) + if (type == typeof(byte[])) return $"0x{CommonUtils.BytesSqlRaw(value as byte[])}"; + if (type == typeof(TimeSpan) || type == typeof(TimeSpan?)) { var ts = (TimeSpan)value; value = $"{ts.Hours}:{ts.Minutes}:{ts.Seconds}"; diff --git a/Providers/FreeSql.Provider.MySql/MySqlAdo/MySqlAdo.cs b/Providers/FreeSql.Provider.MySql/MySqlAdo/MySqlAdo.cs index f492d3ca..57751c7e 100644 --- a/Providers/FreeSql.Provider.MySql/MySqlAdo/MySqlAdo.cs +++ b/Providers/FreeSql.Provider.MySql/MySqlAdo/MySqlAdo.cs @@ -38,6 +38,7 @@ namespace FreeSql.MySql if (param == null) return "NULL"; if (mapType != null && mapType != param.GetType() && (param is IEnumerable == false || mapType.IsArrayOrList())) param = Utils.GetDataReaderValue(mapType, param); + if (param is bool || param is bool?) return (bool)param ? 1 : 0; 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"), "'"); else if (param is TimeSpan || param is TimeSpan?) return ((TimeSpan)param).Ticks / 10; + else if (param is byte[]) + return $"0x{CommonUtils.BytesSqlRaw(param as byte[])}"; else if (param is MygisGeometry) return string.Concat("ST_GeomFromText('", (param as MygisGeometry).AsText().Replace("'", "''"), "')"); else if (param is IEnumerable) diff --git a/Providers/FreeSql.Provider.MySql/MySqlUtils.cs b/Providers/FreeSql.Provider.MySql/MySqlUtils.cs index f00192a3..3e97a404 100644 --- a/Providers/FreeSql.Provider.MySql/MySqlUtils.cs +++ b/Providers/FreeSql.Provider.MySql/MySqlUtils.cs @@ -121,15 +121,8 @@ namespace FreeSql.MySql public override string GetNoneParamaterSqlValue(List specialParams, Type type, object value) { if (value == null) return "NULL"; - if (type == typeof(byte[])) - { - 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?)) + if (type == typeof(byte[])) return $"0x{CommonUtils.BytesSqlRaw(value as byte[])}"; + if (type == typeof(TimeSpan) || type == typeof(TimeSpan?)) { var ts = (TimeSpan)value; value = $"{Math.Floor(ts.TotalHours)}:{ts.Minutes}:{ts.Seconds}"; diff --git a/Providers/FreeSql.Provider.MySqlConnector/MySqlConnectorUtils.cs b/Providers/FreeSql.Provider.MySqlConnector/MySqlConnectorUtils.cs index 5734c337..0f1f122a 100644 --- a/Providers/FreeSql.Provider.MySqlConnector/MySqlConnectorUtils.cs +++ b/Providers/FreeSql.Provider.MySqlConnector/MySqlConnectorUtils.cs @@ -129,15 +129,8 @@ namespace FreeSql.MySql public override string GetNoneParamaterSqlValue(List specialParams, Type type, object value) { if (value == null) return "NULL"; - if (type == typeof(byte[])) - { - 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?)) + if (type == typeof(byte[])) return $"0x{CommonUtils.BytesSqlRaw(value as byte[])}"; + if (type == typeof(TimeSpan) || type == typeof(TimeSpan?)) { var ts = (TimeSpan)value; value = $"{Math.Floor(ts.TotalHours)}:{ts.Minutes}:{ts.Seconds}"; diff --git a/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengAdo/OdbcDamengAdo.cs b/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengAdo/OdbcDamengAdo.cs index 7fa731c7..1bb529b0 100644 --- a/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengAdo/OdbcDamengAdo.cs +++ b/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengAdo/OdbcDamengAdo.cs @@ -37,7 +37,10 @@ namespace FreeSql.Odbc.Dameng if (param == null) return "NULL"; if (mapType != null && mapType != param.GetType() && (param is IEnumerable == false || mapType.IsArrayOrList())) 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; else if (param is string || param is char) return string.Concat("'", param.ToString().Replace("'", "''"), "'"); diff --git a/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengExpression.cs b/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengExpression.cs index f7bcad45..8a26b08c 100644 --- a/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengExpression.cs +++ b/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengExpression.cs @@ -41,7 +41,7 @@ namespace FreeSql.Odbc.Dameng case "System.UInt16": case "System.UInt32": 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; diff --git a/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengUtils.cs b/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengUtils.cs index 0e55dfc1..0a407b2a 100644 --- a/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengUtils.cs +++ b/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengUtils.cs @@ -96,14 +96,7 @@ namespace FreeSql.Odbc.Dameng public override string GetNoneParamaterSqlValue(List specialParams, Type type, object value) { if (value == null) return "NULL"; - if (type == typeof(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(); - } + if (type == typeof(byte[])) return $"hextoraw('{CommonUtils.BytesSqlRaw(value as byte[])}')"; return FormatSql("{0}", value, 1); } } diff --git a/Providers/FreeSql.Provider.Odbc/Default/OdbcAdapter.cs b/Providers/FreeSql.Provider.Odbc/Default/OdbcAdapter.cs index 9ac1d070..a1dd0314 100644 --- a/Providers/FreeSql.Provider.Odbc/Default/OdbcAdapter.cs +++ b/Providers/FreeSql.Provider.Odbc/Default/OdbcAdapter.cs @@ -1,4 +1,5 @@ -using FreeSql.Internal.Model; +using FreeSql.Internal; +using FreeSql.Internal.Model; using System; using System.Collections.Generic; using System.Text; @@ -55,11 +56,7 @@ namespace FreeSql.Odbc.Default public virtual string ByteRawSql(object value) { if (value == null) return "NULL"; - 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(); + return $"0x{CommonUtils.BytesSqlRaw(value as byte[])}"; } public virtual string CastSql(string sql, string to) => $"cast({sql} as {to})"; diff --git a/Providers/FreeSql.Provider.Odbc/Default/OdbcAdo/OdbcAdo.cs b/Providers/FreeSql.Provider.Odbc/Default/OdbcAdo/OdbcAdo.cs index cd8a016a..c5df3ef0 100644 --- a/Providers/FreeSql.Provider.Odbc/Default/OdbcAdo/OdbcAdo.cs +++ b/Providers/FreeSql.Provider.Odbc/Default/OdbcAdo/OdbcAdo.cs @@ -39,6 +39,7 @@ namespace FreeSql.Odbc.Default if (param == null) return "NULL"; if (mapType != null && mapType != param.GetType() && (param is IEnumerable == false || mapType.IsArrayOrList())) param = Utils.GetDataReaderValue(mapType, param); + if (param is bool || param is bool?) return (bool)param ? 1 : 0; else if (param is string) @@ -53,6 +54,8 @@ namespace FreeSql.Odbc.Default return Adapter.DateTimeRawSql(param); else if (param is TimeSpan || param is TimeSpan?) return Adapter.TimeSpanRawSql(param); + else if (param is byte[]) + return Adapter.ByteRawSql(param as byte[]); else if (param is IEnumerable) return AddslashesIEnumerable(param, mapType, mapColumn); diff --git a/Providers/FreeSql.Provider.Odbc/GBase/OdbcGBaseAdo/__OdbcGBaseAdo.cs b/Providers/FreeSql.Provider.Odbc/GBase/OdbcGBaseAdo/__OdbcGBaseAdo.cs index 058e742b..7e627c7b 100644 --- a/Providers/FreeSql.Provider.Odbc/GBase/OdbcGBaseAdo/__OdbcGBaseAdo.cs +++ b/Providers/FreeSql.Provider.Odbc/GBase/OdbcGBaseAdo/__OdbcGBaseAdo.cs @@ -51,6 +51,8 @@ namespace FreeSql.Odbc.GBase return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'"); else if (param is TimeSpan || param is TimeSpan?) return ((TimeSpan)param).Ticks / 10; + else if (param is byte[]) + return $"'\\x{CommonUtils.BytesSqlRaw(param as byte[])}'"; else if (param is IEnumerable) return AddslashesIEnumerable(param, mapType, mapColumn); diff --git a/Providers/FreeSql.Provider.Odbc/GBase/__OdbcGBaseUtils.cs b/Providers/FreeSql.Provider.Odbc/GBase/__OdbcGBaseUtils.cs index c4b722e2..535d561e 100644 --- a/Providers/FreeSql.Provider.Odbc/GBase/__OdbcGBaseUtils.cs +++ b/Providers/FreeSql.Provider.Odbc/GBase/__OdbcGBaseUtils.cs @@ -124,15 +124,8 @@ namespace FreeSql.Odbc.GBase if (value == null) return "NULL"; value = getParamterValue(type, value); var type2 = value.GetType(); - if (type2 == typeof(byte[])) - { - 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?)) + if (type2 == typeof(byte[])) return $"'\\x{CommonUtils.BytesSqlRaw(value as byte[])}'"; + if (type2 == typeof(TimeSpan) || type2 == typeof(TimeSpan?)) { var ts = (TimeSpan)value; return $"'{Math.Min(24, (int)Math.Floor(ts.TotalHours))}:{ts.Minutes}:{ts.Seconds}'"; diff --git a/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlAdo/OdbcMySqlAdo.cs b/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlAdo/OdbcMySqlAdo.cs index 810fbf3c..49fb8d61 100644 --- a/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlAdo/OdbcMySqlAdo.cs +++ b/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlAdo/OdbcMySqlAdo.cs @@ -38,6 +38,7 @@ namespace FreeSql.Odbc.MySql if (param == null) return "NULL"; if (mapType != null && mapType != param.GetType() && (param is IEnumerable == false || mapType.IsArrayOrList())) param = Utils.GetDataReaderValue(mapType, param); + if (param is bool || param is bool?) return (bool)param ? 1 : 0; 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"), "'"); else if (param is TimeSpan || param is TimeSpan?) return ((TimeSpan)param).Ticks / 10; + else if (param is byte[]) + return $"0x{CommonUtils.BytesSqlRaw(param as byte[])}"; else if (param is IEnumerable) return AddslashesIEnumerable(param, mapType, mapColumn); diff --git a/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlUtils.cs b/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlUtils.cs index cfc79dbd..1e048430 100644 --- a/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlUtils.cs +++ b/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlUtils.cs @@ -92,15 +92,8 @@ namespace FreeSql.Odbc.MySql public override string GetNoneParamaterSqlValue(List specialParams, Type type, object value) { if (value == null) return "NULL"; - if (type == typeof(byte[])) - { - 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?)) + if (type == typeof(byte[])) return $"0x{CommonUtils.BytesSqlRaw(value as byte[])}"; + if (type == typeof(TimeSpan) || type == typeof(TimeSpan?)) { var ts = (TimeSpan)value; value = $"{Math.Floor(ts.TotalHours)}:{ts.Minutes}:{ts.Seconds}"; diff --git a/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleAdo/OdbcOracleAdo.cs b/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleAdo/OdbcOracleAdo.cs index d13b2bb9..b7d9c10b 100644 --- a/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleAdo/OdbcOracleAdo.cs +++ b/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleAdo/OdbcOracleAdo.cs @@ -37,7 +37,10 @@ namespace FreeSql.Odbc.Oracle if (param == null) return "NULL"; if (mapType != null && mapType != param.GetType() && (param is IEnumerable == false || mapType.IsArrayOrList())) 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; else if (param is string || param is char) return string.Concat("'", param.ToString().Replace("'", "''"), "'"); diff --git a/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleExpression.cs b/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleExpression.cs index dbb94fdd..a31f14d9 100644 --- a/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleExpression.cs +++ b/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleExpression.cs @@ -41,7 +41,7 @@ namespace FreeSql.Odbc.Oracle case "System.UInt16": case "System.UInt32": 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; diff --git a/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleUtils.cs b/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleUtils.cs index b33fc74d..bf7dc392 100644 --- a/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleUtils.cs +++ b/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleUtils.cs @@ -96,14 +96,7 @@ namespace FreeSql.Odbc.Oracle public override string GetNoneParamaterSqlValue(List specialParams, Type type, object value) { if (value == null) return "NULL"; - if (type == typeof(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(); - } + if (type == typeof(byte[])) return $"hextoraw('{CommonUtils.BytesSqlRaw(value as byte[])}')"; return FormatSql("{0}", value, 1); } } diff --git a/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLAdo/OdbcPostgreSQLAdo.cs b/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLAdo/OdbcPostgreSQLAdo.cs index fc3c6823..0d3b0526 100644 --- a/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLAdo/OdbcPostgreSQLAdo.cs +++ b/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLAdo/OdbcPostgreSQLAdo.cs @@ -39,6 +39,7 @@ namespace FreeSql.Odbc.PostgreSQL if (param == null) return "NULL"; if (mapType != null && mapType != param.GetType() && (param is IEnumerable == false || mapType.IsArrayOrList())) param = Utils.GetDataReaderValue(mapType, param); + if (param is bool || param is bool?) return (bool)param ? "'t'" : "'f'"; 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"), "'"); else if (param is TimeSpan || param is TimeSpan?) return ((TimeSpan)param).Ticks / 10; + else if (param is byte[]) + return $"'\\x{CommonUtils.BytesSqlRaw(param as byte[])}'"; else if (param is IEnumerable) return AddslashesIEnumerable(param, mapType, mapColumn); diff --git a/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLUtils.cs b/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLUtils.cs index 5275357f..e139a342 100644 --- a/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLUtils.cs +++ b/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLUtils.cs @@ -124,15 +124,8 @@ namespace FreeSql.Odbc.PostgreSQL if (value == null) return "NULL"; value = getParamterValue(type, value); var type2 = value.GetType(); - if (type2 == typeof(byte[])) - { - 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?)) + if (type2 == typeof(byte[])) return $"'\\x{CommonUtils.BytesSqlRaw(value as byte[])}'"; + if (type2 == typeof(TimeSpan) || type2 == typeof(TimeSpan?)) { var ts = (TimeSpan)value; return $"'{Math.Min(24, (int)Math.Floor(ts.TotalHours))}:{ts.Minutes}:{ts.Seconds}'"; diff --git a/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerAdo/OdbcSqlServerAdo.cs b/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerAdo/OdbcSqlServerAdo.cs index a22adce1..20c58366 100644 --- a/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerAdo/OdbcSqlServerAdo.cs +++ b/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerAdo/OdbcSqlServerAdo.cs @@ -40,6 +40,7 @@ namespace FreeSql.Odbc.SqlServer if (param == null) return "NULL"; if (mapType != null && mapType != param.GetType() && (param is IEnumerable == false || mapType.IsArrayOrList())) param = Utils.GetDataReaderValue(mapType, param); + if (param is bool || param is bool?) return (bool)param ? 1 : 0; else if (param is string) @@ -66,6 +67,8 @@ namespace FreeSql.Odbc.SqlServer } else if (param is TimeSpan || param is TimeSpan?) return ((TimeSpan)param).TotalSeconds; + else if (param is byte[]) + return $"0x{CommonUtils.BytesSqlRaw(param as byte[])}"; else if (param is IEnumerable) return AddslashesIEnumerable(param, mapType, mapColumn); diff --git a/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerUtils.cs b/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerUtils.cs index 8b00e08d..dd0d11d9 100644 --- a/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerUtils.cs +++ b/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerUtils.cs @@ -83,15 +83,8 @@ namespace FreeSql.Odbc.SqlServer public override string GetNoneParamaterSqlValue(List specialParams, Type type, object value) { if (value == null) return "NULL"; - if (type == typeof(byte[])) - { - 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?)) + if (type == typeof(byte[])) return $"0x{CommonUtils.BytesSqlRaw(value as byte[])}"; + if (type == typeof(TimeSpan) || type == typeof(TimeSpan?)) { var ts = (TimeSpan)value; value = $"{ts.Hours}:{ts.Minutes}:{ts.Seconds}.{ts.Milliseconds}"; diff --git a/Providers/FreeSql.Provider.Oracle/OracleAdo/OracleAdo.cs b/Providers/FreeSql.Provider.Oracle/OracleAdo/OracleAdo.cs index 50beedec..67ac84db 100644 --- a/Providers/FreeSql.Provider.Oracle/OracleAdo/OracleAdo.cs +++ b/Providers/FreeSql.Provider.Oracle/OracleAdo/OracleAdo.cs @@ -37,7 +37,10 @@ namespace FreeSql.Oracle if (param == null) return "NULL"; if (mapType != null && mapType != param.GetType() && (param is IEnumerable == false || mapType.IsArrayOrList())) 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; else if (param is string || param is char) return string.Concat("'", param.ToString().Replace("'", "''"), "'"); diff --git a/Providers/FreeSql.Provider.Oracle/OracleExpression.cs b/Providers/FreeSql.Provider.Oracle/OracleExpression.cs index 4642c1c1..79682275 100644 --- a/Providers/FreeSql.Provider.Oracle/OracleExpression.cs +++ b/Providers/FreeSql.Provider.Oracle/OracleExpression.cs @@ -68,7 +68,7 @@ namespace FreeSql.Oracle case "System.UInt16": case "System.UInt32": 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; case "NewGuid": diff --git a/Providers/FreeSql.Provider.Oracle/OracleUtils.cs b/Providers/FreeSql.Provider.Oracle/OracleUtils.cs index 68d5a100..f3a7621e 100644 --- a/Providers/FreeSql.Provider.Oracle/OracleUtils.cs +++ b/Providers/FreeSql.Provider.Oracle/OracleUtils.cs @@ -91,14 +91,7 @@ namespace FreeSql.Oracle public override string GetNoneParamaterSqlValue(List specialParams, Type type, object value) { if (value == null) return "NULL"; - if (type == typeof(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(); - } + if (type == typeof(byte[])) return $"hextoraw('{CommonUtils.BytesSqlRaw(value as byte[])}')"; return FormatSql("{0}", value, 1); } } diff --git a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLAdo/PostgreSQLAdo.cs b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLAdo/PostgreSQLAdo.cs index 7f6da042..8f7e2a36 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLAdo/PostgreSQLAdo.cs +++ b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLAdo/PostgreSQLAdo.cs @@ -40,6 +40,7 @@ namespace FreeSql.PostgreSQL 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)) param = Utils.GetDataReaderValue(mapType, param); + bool isdic; if (param is bool || param is bool?) 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"), "'"); else if (param is TimeSpan || param is TimeSpan?) 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) return string.Concat("'", param.ToString().Replace("'", "''"), "'::jsonb"); else if ((isdic = param is Dictionary) || diff --git a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLUtils.cs b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLUtils.cs index 72a680f9..729e3b18 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLUtils.cs +++ b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLUtils.cs @@ -156,15 +156,8 @@ namespace FreeSql.PostgreSQL } value = getParamterValue(type, value); var type2 = value.GetType(); - if (type2 == typeof(byte[])) - { - 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?)) + if (type2 == typeof(byte[])) return $"'\\x{CommonUtils.BytesSqlRaw(value as byte[])}'"; + if (type2 == typeof(TimeSpan) || type2 == typeof(TimeSpan?)) { var ts = (TimeSpan)value; return $"'{Math.Min(24, (int)Math.Floor(ts.TotalHours))}:{ts.Minutes}:{ts.Seconds}'"; diff --git a/Providers/FreeSql.Provider.SqlServer/SqlServerAdo/SqlServerAdo.cs b/Providers/FreeSql.Provider.SqlServer/SqlServerAdo/SqlServerAdo.cs index b12cdf10..5b247b31 100644 --- a/Providers/FreeSql.Provider.SqlServer/SqlServerAdo/SqlServerAdo.cs +++ b/Providers/FreeSql.Provider.SqlServer/SqlServerAdo/SqlServerAdo.cs @@ -41,6 +41,7 @@ namespace FreeSql.SqlServer if (param == null) return "NULL"; if (mapType != null && mapType != param.GetType() && (param is IEnumerable == false || mapType.IsArrayOrList())) param = Utils.GetDataReaderValue(mapType, param); + if (param is bool || param is bool?) return (bool)param ? 1 : 0; else if (param is string) @@ -67,6 +68,8 @@ namespace FreeSql.SqlServer } else if (param is TimeSpan || param is TimeSpan?) return ((TimeSpan)param).TotalSeconds; + else if (param is byte[]) + return $"0x{CommonUtils.BytesSqlRaw(param as byte[])}"; else if (param is IEnumerable) return AddslashesIEnumerable(param, mapType, mapColumn); diff --git a/Providers/FreeSql.Provider.SqlServer/SqlServerUtils.cs b/Providers/FreeSql.Provider.SqlServer/SqlServerUtils.cs index 9737ffe4..ef5e5b8b 100644 --- a/Providers/FreeSql.Provider.SqlServer/SqlServerUtils.cs +++ b/Providers/FreeSql.Provider.SqlServer/SqlServerUtils.cs @@ -94,15 +94,8 @@ namespace FreeSql.SqlServer public override string GetNoneParamaterSqlValue(List specialParams, Type type, object value) { if (value == null) return "NULL"; - if (type == typeof(byte[])) - { - 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?)) + if (type == typeof(byte[])) return $"0x{CommonUtils.BytesSqlRaw(value as byte[])}"; + if (type == typeof(TimeSpan) || type == typeof(TimeSpan?)) { var ts = (TimeSpan)value; value = $"{ts.Hours}:{ts.Minutes}:{ts.Seconds}.{ts.Milliseconds}"; diff --git a/Providers/FreeSql.Provider.Sqlite/SqliteAdo/SqliteAdo.cs b/Providers/FreeSql.Provider.Sqlite/SqliteAdo/SqliteAdo.cs index c6d37238..213c1db5 100644 --- a/Providers/FreeSql.Provider.Sqlite/SqliteAdo/SqliteAdo.cs +++ b/Providers/FreeSql.Provider.Sqlite/SqliteAdo/SqliteAdo.cs @@ -36,6 +36,7 @@ namespace FreeSql.Sqlite if (param == null) return "NULL"; if (mapType != null && mapType != param.GetType() && (param is IEnumerable == false || mapType.IsArrayOrList())) param = Utils.GetDataReaderValue(mapType, param); + if (param is bool || param is bool?) return (bool)param ? 1 : 0; 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"), "'"); else if (param is TimeSpan || param is TimeSpan?) return ((TimeSpan)param).Ticks / 10000; + else if (param is byte[]) + return string.Concat("'", Encoding.UTF8.GetString(param as byte[]), "'"); else if (param is IEnumerable) return AddslashesIEnumerable(param, mapType, mapColumn); diff --git a/Providers/FreeSql.Provider.Sqlite/SqliteUtils.cs b/Providers/FreeSql.Provider.Sqlite/SqliteUtils.cs index 99c23e82..12b81771 100644 --- a/Providers/FreeSql.Provider.Sqlite/SqliteUtils.cs +++ b/Providers/FreeSql.Provider.Sqlite/SqliteUtils.cs @@ -94,7 +94,6 @@ namespace FreeSql.Sqlite public override string GetNoneParamaterSqlValue(List specialParams, Type type, object value) { if (value == null) return "NULL"; - if (type == typeof(byte[])) value = Encoding.UTF8.GetString(value as byte[]); return FormatSql("{0}", value, 1); } }