From 93562fd8029406233a76343475731b010d55fb06 Mon Sep 17 00:00:00 2001 From: 28810 <28810@YEXIANGQIN> Date: Mon, 10 Aug 2020 17:57:29 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E4=BC=98=E5=8C=96=20NoneParameter=20Oracle?= =?UTF-8?q?=20=E6=96=87=E6=9C=AC=E8=B6=85=E9=95=BF=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Oracle/OracleCodeFirstTest.cs | 30 ++- .../Sqlite/SqliteCodeFirstTest.cs | 7 + .../CommonProvider/InsertOrUpdateProvider.cs | 2 +- .../Internal/CommonProvider/InsertProvider.cs | 6 +- .../Internal/CommonProvider/UpdateProvider.cs | 10 +- FreeSql/Internal/CommonUtils.cs | 2 +- FreeSql/Internal/UtilsExpressionTree.cs | 2 +- .../Curd/DamengInsert.cs | 3 +- .../FreeSql.Provider.Dameng/DamengUtils.cs | 2 +- .../MsAccessUtils.cs | 2 +- .../Curd/MySqlInsertOrUpdate.cs | 1 + .../Curd/OnDuplicateKeyUpdate.cs | 1 + .../FreeSql.Provider.MySql/MySqlUtils.cs | 2 +- .../MySqlConnectorUtils.cs | 2 +- .../Dameng/Curd/OdbcDamengInsert.cs | 3 +- .../Dameng/OdbcDamengUtils.cs | 2 +- .../Default/OdbcUtils.cs | 2 +- .../Curd/OdbcKingbaseESInsertOrUpdate.cs | 1 + .../Curd/OdbcKingbaseESOnConflictDoUpdate.cs | 1 + .../KingbaseES/OdbcKingbaseESUtils.cs | 4 +- .../MySql/Curd/OdbcMySqlInsertOrUpdate.cs | 1 + .../Curd/OdbcMySqlOnDuplicateKeyUpdate.cs | 1 + .../MySql/OdbcMySqlUtils.cs | 2 +- .../Oracle/Curd/OdbcOracleInsert.cs | 3 +- .../Oracle/OdbcOracleUtils.cs | 23 +- .../Curd/OdbcPostgreSQLInsertOrUpdate.cs | 1 + .../Curd/OdbcPostgreSQLOnConflictDoUpdate.cs | 1 + .../PostgreSQL/OdbcPostgreSQLUtils.cs | 4 +- .../SqlServer/OdbcSqlServerUtils.cs | 2 +- .../Curd/OracleInsert.cs | 3 +- .../FreeSql.Provider.Oracle/OracleUtils.cs | 23 +- .../Curd/OnConflictDoUpdate.cs | 1 + .../Curd/PostgreSQLInsertOrUpdate.cs | 1 + .../PostgreSQLUtils.cs | 6 +- .../Curd/OnConflictDoUpdate.cs | 207 ------------------ .../ShenTongUtils.cs | 4 +- .../SqlServerUtils.cs | 2 +- .../Curd/SqliteInsertOrUpdate.cs | 1 + .../FreeSql.Provider.Sqlite/SqliteUtils.cs | 7 +- 39 files changed, 129 insertions(+), 249 deletions(-) delete mode 100644 Providers/FreeSql.Provider.ShenTong/Curd/OnConflictDoUpdate.cs diff --git a/FreeSql.Tests/FreeSql.Tests/Oracle/OracleCodeFirstTest.cs b/FreeSql.Tests/FreeSql.Tests/Oracle/OracleCodeFirstTest.cs index 5774f0a6..bdf17b8d 100644 --- a/FreeSql.Tests/FreeSql.Tests/Oracle/OracleCodeFirstTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Oracle/OracleCodeFirstTest.cs @@ -25,8 +25,11 @@ namespace FreeSql.Tests.Oracle //NoneParameter item1 = new TS_NCLB02 { Data = str1 }; - Assert.Throws(() => g.oracle.Insert(item1).NoneParameter().ExecuteAffrows()); + Assert.Equal(1, g.oracle.Insert(item1).NoneParameter().ExecuteAffrows()); //Oracle.ManagedDataAccess.Client.OracleException:“ORA-01704: 字符串文字太长” + + item2 = g.oracle.Select().Where(a => a.Id == item1.Id).First(); + Assert.Equal(str1, item2.Data); } class TS_NCLB02 { @@ -48,8 +51,11 @@ namespace FreeSql.Tests.Oracle //NoneParameter item1 = new TS_NCLB01 { Data = str1 }; - Assert.Throws(() => g.oracle.Insert(item1).NoneParameter().ExecuteAffrows()); + Assert.Equal(1, g.oracle.Insert(item1).NoneParameter().ExecuteAffrows()); //Oracle.ManagedDataAccess.Client.OracleException:“ORA-01704: 字符串文字太长” + + item2 = g.oracle.Select().Where(a => a.Id == item1.Id).First(); + Assert.Equal(str1, item2.Data); } class TS_NCLB01 { @@ -70,8 +76,11 @@ namespace FreeSql.Tests.Oracle //NoneParameter item1 = new TS_CLB01 { Data = str1 }; - Assert.Throws(() => g.oracle.Insert(item1).NoneParameter().ExecuteAffrows()); + Assert.Equal(1, g.oracle.Insert(item1).NoneParameter().ExecuteAffrows()); //Oracle.ManagedDataAccess.Client.OracleException:“ORA-01704: 字符串文字太长” + + item2 = g.oracle.Select().Where(a => a.Id == item1.Id).First(); + Assert.Equal(str1, item2.Data); } class TS_CLB01 { @@ -96,8 +105,21 @@ namespace FreeSql.Tests.Oracle //NoneParameter item1 = new TS_BLB01 { Data = data1 }; - Assert.Throws(() => g.oracle.Insert(item1).NoneParameter().ExecuteAffrows()); + Assert.Equal(1, g.oracle.Insert(item1).NoneParameter().ExecuteAffrows()); //Oracle.ManagedDataAccess.Client.OracleException:“ORA-01704: 字符串文字太长” + + item2 = g.oracle.Select().Where(a => a.Id == item1.Id).First(); + Assert.Equal(item1.Data.Length, item2.Data.Length); + + str2 = Encoding.UTF8.GetString(item2.Data); + Assert.Equal(str1, str2); + + Assert.Equal(1, g.oracle.InsertOrUpdate().SetSource(new TS_BLB01 { Data = data1 }).ExecuteAffrows()); + item2 = g.oracle.Select().Where(a => a.Id == item1.Id).First(); + Assert.Equal(item1.Data.Length, item2.Data.Length); + + str2 = Encoding.UTF8.GetString(item2.Data); + Assert.Equal(str1, str2); } class TS_BLB01 { diff --git a/FreeSql.Tests/FreeSql.Tests/Sqlite/SqliteCodeFirstTest.cs b/FreeSql.Tests/FreeSql.Tests/Sqlite/SqliteCodeFirstTest.cs index 9f00a265..ab378295 100644 --- a/FreeSql.Tests/FreeSql.Tests/Sqlite/SqliteCodeFirstTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Sqlite/SqliteCodeFirstTest.cs @@ -35,6 +35,13 @@ namespace FreeSql.Tests.Sqlite str2 = Encoding.UTF8.GetString(item2.Data); Assert.Equal(str1, str2); + + Assert.Equal(1, g.sqlite.InsertOrUpdate().SetSource(new TS_BLB01 { Data = data1 }).ExecuteAffrows()); + item2 = g.sqlite.Select().Where(a => a.Id == item1.Id).First(); + Assert.Equal(item1.Data.Length, item2.Data.Length); + + str2 = Encoding.UTF8.GetString(item2.Data); + Assert.Equal(str1, str2); } class TS_BLB01 { diff --git a/FreeSql/Internal/CommonProvider/InsertOrUpdateProvider.cs b/FreeSql/Internal/CommonProvider/InsertOrUpdateProvider.cs index 915eeca5..28bffde0 100644 --- a/FreeSql/Internal/CommonProvider/InsertOrUpdateProvider.cs +++ b/FreeSql/Internal/CommonProvider/InsertOrUpdateProvider.cs @@ -167,7 +167,7 @@ namespace FreeSql.Internal.CommonProvider else { object val = col.GetMapValue(d); - sb.Append(_commonUtils.GetNoneParamaterSqlValue(dbParams, col.Attribute.MapType, val)); + sb.Append(_commonUtils.GetNoneParamaterSqlValue(dbParams, "cu", col.Attribute.MapType, val)); } if (didx == 0) sb.Append(" as ").Append(col.Attribute.Name); ++colidx2; diff --git a/FreeSql/Internal/CommonProvider/InsertProvider.cs b/FreeSql/Internal/CommonProvider/InsertProvider.cs index 6275a822..596a58b7 100644 --- a/FreeSql/Internal/CommonProvider/InsertProvider.cs +++ b/FreeSql/Internal/CommonProvider/InsertProvider.cs @@ -23,6 +23,7 @@ namespace FreeSql.Internal.CommonProvider public Dictionary _auditValueChangedDict = new Dictionary(StringComparer.CurrentCultureIgnoreCase); public TableInfo _table; public Func _tableRule; + public string _noneParameterFlag = "c"; public bool _noneParameter, _insertIdentity; public int _batchValuesLimit, _batchParameterLimit; public bool _batchAutoTransaction = true; @@ -550,7 +551,7 @@ namespace FreeSql.Internal.CommonProvider object val = col.GetMapValue(d); if (val == null && col.Attribute.IsNullable == false) val = col.CsType == typeof(string) ? "" : Utils.GetDataReaderValue(col.CsType.NullableTypeOrThis(), null);//#384 if (_noneParameter) - sb.Append(_commonUtils.GetNoneParamaterSqlValue(specialParams, col.Attribute.MapType, val)); + sb.Append(_commonUtils.GetNoneParamaterSqlValue(specialParams, _noneParameterFlag, col.Attribute.MapType, val)); else { sb.Append(_commonUtils.QuoteWriteParamter(col.Attribute.MapType, _commonUtils.QuoteParamterName($"{col.CsName}_{didx}"))); @@ -563,8 +564,7 @@ namespace FreeSql.Internal.CommonProvider onrow?.Invoke(d, didx, sb); ++didx; } - if (_noneParameter && specialParams.Any()) - _params = specialParams.ToArray(); + if (_noneParameter && specialParams.Any()) _params = specialParams.ToArray(); return sb.ToString(); } diff --git a/FreeSql/Internal/CommonProvider/UpdateProvider.cs b/FreeSql/Internal/CommonProvider/UpdateProvider.cs index 93b500a3..5b5f36db 100644 --- a/FreeSql/Internal/CommonProvider/UpdateProvider.cs +++ b/FreeSql/Internal/CommonProvider/UpdateProvider.cs @@ -409,7 +409,7 @@ namespace FreeSql.Internal.CommonProvider _set.Append(", ").Append(_commonUtils.QuoteSqlName(col.Attribute.Name)).Append(" = "); if (_noneParameter) { - _set.Append(_commonUtils.GetNoneParamaterSqlValue(_params, col.Attribute.MapType, paramVal)); + _set.Append(_commonUtils.GetNoneParamaterSqlValue(_params, "u", col.Attribute.MapType, paramVal)); } else { @@ -565,7 +565,7 @@ namespace FreeSql.Internal.CommonProvider var sb = new StringBuilder(); sb.Append(_commonUtils.QuoteSqlName(col.Attribute.Name)).Append(" = "); - sb.Append(thenValue(_commonUtils.GetNoneParamaterSqlValue(_paramsSource, col.Attribute.MapType, col.GetMapValue(_source.First())))); + sb.Append(thenValue(_commonUtils.GetNoneParamaterSqlValue(_paramsSource, "u", col.Attribute.MapType, col.GetMapValue(_source.First())))); return sb.ToString(); @@ -589,7 +589,7 @@ namespace FreeSql.Internal.CommonProvider ToSqlWhen(cwsb, _table.Primarys, d); cwsb.Append(" THEN "); var val = col.GetMapValue(d); - cwsb.Append(thenValue(_commonUtils.GetNoneParamaterSqlValue(_paramsSource, col.Attribute.MapType, val))); + cwsb.Append(thenValue(_commonUtils.GetNoneParamaterSqlValue(_paramsSource, "u", col.Attribute.MapType, val))); if (val == null || val == DBNull.Value) nulls++; } cwsb.Append(" END"); @@ -661,7 +661,7 @@ namespace FreeSql.Internal.CommonProvider { var val = col.GetMapValue(_source.First()); if (_noneParameter) - sb.Append(_commonUtils.GetNoneParamaterSqlValue(_paramsSource, col.Attribute.MapType, val)); + sb.Append(_commonUtils.GetNoneParamaterSqlValue(_paramsSource, "u", col.Attribute.MapType, val)); else { sb.Append(_commonUtils.QuoteWriteParamter(col.Attribute.MapType, _commonUtils.QuoteParamterName($"p_{_paramsSource.Count}"))); @@ -705,7 +705,7 @@ namespace FreeSql.Internal.CommonProvider cwsb.Append(" THEN "); var val = col.GetMapValue(d); if (_noneParameter) - cwsb.Append(_commonUtils.GetNoneParamaterSqlValue(_paramsSource, col.Attribute.MapType, val)); + cwsb.Append(_commonUtils.GetNoneParamaterSqlValue(_paramsSource, "u", col.Attribute.MapType, val)); else { cwsb.Append(_commonUtils.QuoteWriteParamter(col.Attribute.MapType, _commonUtils.QuoteParamterName($"p_{_paramsSource.Count}"))); diff --git a/FreeSql/Internal/CommonUtils.cs b/FreeSql/Internal/CommonUtils.cs index 1fbac9fa..7d0704c0 100644 --- a/FreeSql/Internal/CommonUtils.cs +++ b/FreeSql/Internal/CommonUtils.cs @@ -23,7 +23,7 @@ namespace FreeSql.Internal public abstract class CommonUtils { - public abstract string GetNoneParamaterSqlValue(List specialParams, Type type, object value); + public abstract string GetNoneParamaterSqlValue(List specialParams, string specialParamFlag, Type type, object value); public abstract DbParameter AppendParamter(List _params, string parameterName, ColumnInfo col, Type type, object value); public abstract DbParameter[] GetDbParamtersByObject(string sql, object obj); public abstract string FormatSql(string sql, params object[] args); diff --git a/FreeSql/Internal/UtilsExpressionTree.cs b/FreeSql/Internal/UtilsExpressionTree.cs index 549cdac1..ab180445 100644 --- a/FreeSql/Internal/UtilsExpressionTree.cs +++ b/FreeSql/Internal/UtilsExpressionTree.cs @@ -187,7 +187,7 @@ namespace FreeSql.Internal } try { - col.DbDefaultValue = common.GetNoneParamaterSqlValue(new List(), colattr.MapType, defaultValue); + col.DbDefaultValue = common.GetNoneParamaterSqlValue(new List(), "init", colattr.MapType, defaultValue); } catch { diff --git a/Providers/FreeSql.Provider.Dameng/Curd/DamengInsert.cs b/Providers/FreeSql.Provider.Dameng/Curd/DamengInsert.cs index 2bee3fba..b2181171 100644 --- a/Providers/FreeSql.Provider.Dameng/Curd/DamengInsert.cs +++ b/Providers/FreeSql.Provider.Dameng/Curd/DamengInsert.cs @@ -69,7 +69,7 @@ namespace FreeSql.Dameng.Curd object val = col.GetMapValue(d); if (val == null && col.Attribute.IsNullable == false) val = col.CsType == typeof(string) ? "" : Utils.GetDataReaderValue(col.CsType.NullableTypeOrThis(), null);//#384 if (_noneParameter) - sb.Append(_commonUtils.GetNoneParamaterSqlValue(specialParams, col.Attribute.MapType, val)); + sb.Append(_commonUtils.GetNoneParamaterSqlValue(specialParams, _noneParameterFlag, col.Attribute.MapType, val)); else { sb.Append(_commonUtils.QuoteWriteParamter(col.Attribute.MapType, _commonUtils.QuoteParamterName($"{col.CsName}_{didx}"))); @@ -81,6 +81,7 @@ namespace FreeSql.Dameng.Curd sb.Append(")"); ++didx; } + if (_noneParameter && specialParams.Any()) _params = specialParams.ToArray(); if (_source.Count > 1) sb.Append("\r\n SELECT 1 FROM DUAL"); return sb.ToString(); } diff --git a/Providers/FreeSql.Provider.Dameng/DamengUtils.cs b/Providers/FreeSql.Provider.Dameng/DamengUtils.cs index 8d26e29f..b9500106 100644 --- a/Providers/FreeSql.Provider.Dameng/DamengUtils.cs +++ b/Providers/FreeSql.Provider.Dameng/DamengUtils.cs @@ -93,7 +93,7 @@ namespace FreeSql.Dameng public override string QuoteWriteParamter(Type type, string paramterName) => paramterName; public override string QuoteReadColumn(Type type, Type mapType, string columnName) => columnName; - public override string GetNoneParamaterSqlValue(List specialParams, Type type, object value) + public override string GetNoneParamaterSqlValue(List specialParams, string specialParamFlag, Type type, object value) { if (value == null) return "NULL"; if (type.IsNumberType()) return string.Format(CultureInfo.InvariantCulture, "{0}", value); diff --git a/Providers/FreeSql.Provider.MsAccess/MsAccessUtils.cs b/Providers/FreeSql.Provider.MsAccess/MsAccessUtils.cs index c5c7aa2d..ed8fc51b 100644 --- a/Providers/FreeSql.Provider.MsAccess/MsAccessUtils.cs +++ b/Providers/FreeSql.Provider.MsAccess/MsAccessUtils.cs @@ -82,7 +82,7 @@ namespace FreeSql.MsAccess public override string FieldAsAlias(string alias) => $" as {alias}"; public override string IIF(string test, string ifTrue, string ifElse) => $"iif({test}, {ifTrue}, {ifElse})"; - public override string GetNoneParamaterSqlValue(List specialParams, Type type, object value) + public override string GetNoneParamaterSqlValue(List specialParams, string specialParamFlag, Type type, object value) { if (value == null) return "NULL"; if (type.IsNumberType()) return string.Format(CultureInfo.InvariantCulture, "{0}", value); diff --git a/Providers/FreeSql.Provider.MySql/Curd/MySqlInsertOrUpdate.cs b/Providers/FreeSql.Provider.MySql/Curd/MySqlInsertOrUpdate.cs index 9a275be2..46fc44d6 100644 --- a/Providers/FreeSql.Provider.MySql/Curd/MySqlInsertOrUpdate.cs +++ b/Providers/FreeSql.Provider.MySql/Curd/MySqlInsertOrUpdate.cs @@ -37,6 +37,7 @@ namespace FreeSql.MySql.Curd .WithTransaction(_transaction) .NoneParameter(true) as Internal.CommonProvider.InsertProvider; insert._source = data; + insert._noneParameterFlag = flagInsert ? "cuc" : "cu"; string sql = ""; if (IdentityColumn != null && flagInsert) sql = insert.ToSql(); diff --git a/Providers/FreeSql.Provider.MySql/Curd/OnDuplicateKeyUpdate.cs b/Providers/FreeSql.Provider.MySql/Curd/OnDuplicateKeyUpdate.cs index 66118ee1..802ab4c1 100644 --- a/Providers/FreeSql.Provider.MySql/Curd/OnDuplicateKeyUpdate.cs +++ b/Providers/FreeSql.Provider.MySql/Curd/OnDuplicateKeyUpdate.cs @@ -17,6 +17,7 @@ namespace FreeSql.MySql.Curd { _mysqlInsert = insert as MySqlInsert; if (_mysqlInsert == null) throw new Exception("OnDuplicateKeyUpdate 鏄 FreeSql.Provider.MySql/FreeSql.Provider.MySqlConnector 鐗规湁鐨勫姛鑳"); + if (_mysqlInsert._noneParameterFlag == "c") _mysqlInsert._noneParameterFlag = "cu"; } protected void ClearData() diff --git a/Providers/FreeSql.Provider.MySql/MySqlUtils.cs b/Providers/FreeSql.Provider.MySql/MySqlUtils.cs index 3986c65b..5a4ced4d 100644 --- a/Providers/FreeSql.Provider.MySql/MySqlUtils.cs +++ b/Providers/FreeSql.Provider.MySql/MySqlUtils.cs @@ -126,7 +126,7 @@ namespace FreeSql.MySql return columnName; } - public override string GetNoneParamaterSqlValue(List specialParams, Type type, object value) + public override string GetNoneParamaterSqlValue(List specialParams, string specialParamFlag, Type type, object value) { if (value == null) return "NULL"; if (type.IsNumberType()) return string.Format(CultureInfo.InvariantCulture, "{0}", value); diff --git a/Providers/FreeSql.Provider.MySqlConnector/MySqlConnectorUtils.cs b/Providers/FreeSql.Provider.MySqlConnector/MySqlConnectorUtils.cs index df8e23b4..221855b1 100644 --- a/Providers/FreeSql.Provider.MySqlConnector/MySqlConnectorUtils.cs +++ b/Providers/FreeSql.Provider.MySqlConnector/MySqlConnectorUtils.cs @@ -146,7 +146,7 @@ namespace FreeSql.MySql return columnName; } - public override string GetNoneParamaterSqlValue(List specialParams, Type type, object value) + public override string GetNoneParamaterSqlValue(List specialParams, string specialParamFlag, Type type, object value) { if (value == null) return "NULL"; if (type.IsNumberType()) return string.Format(CultureInfo.InvariantCulture, "{0}", value); diff --git a/Providers/FreeSql.Provider.Odbc/Dameng/Curd/OdbcDamengInsert.cs b/Providers/FreeSql.Provider.Odbc/Dameng/Curd/OdbcDamengInsert.cs index de1f043d..85dcab11 100644 --- a/Providers/FreeSql.Provider.Odbc/Dameng/Curd/OdbcDamengInsert.cs +++ b/Providers/FreeSql.Provider.Odbc/Dameng/Curd/OdbcDamengInsert.cs @@ -69,7 +69,7 @@ namespace FreeSql.Odbc.Dameng object val = col.GetMapValue(d); if (val == null && col.Attribute.IsNullable == false) val = col.CsType == typeof(string) ? "" : Utils.GetDataReaderValue(col.CsType.NullableTypeOrThis(), null);//#384 if (_noneParameter) - sb.Append(_commonUtils.GetNoneParamaterSqlValue(specialParams, col.Attribute.MapType, val)); + sb.Append(_commonUtils.GetNoneParamaterSqlValue(specialParams, _noneParameterFlag, col.Attribute.MapType, val)); else { sb.Append(_commonUtils.QuoteWriteParamter(col.Attribute.MapType, _commonUtils.QuoteParamterName($"{col.CsName}_{didx}"))); @@ -81,6 +81,7 @@ namespace FreeSql.Odbc.Dameng sb.Append(")"); ++didx; } + if (_noneParameter && specialParams.Any()) _params = specialParams.ToArray(); if (_source.Count > 1) sb.Append("\r\n SELECT 1 FROM DUAL"); return sb.ToString(); } diff --git a/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengUtils.cs b/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengUtils.cs index 50391fab..a9edc60d 100644 --- a/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengUtils.cs +++ b/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengUtils.cs @@ -99,7 +99,7 @@ namespace FreeSql.Odbc.Dameng public override string QuoteWriteParamter(Type type, string paramterName) => paramterName; public override string QuoteReadColumn(Type type, Type mapType, string columnName) => columnName; - public override string GetNoneParamaterSqlValue(List specialParams, Type type, object value) + public override string GetNoneParamaterSqlValue(List specialParams, string specialParamFlag, Type type, object value) { if (value == null) return "NULL"; if (type.IsNumberType()) return string.Format(CultureInfo.InvariantCulture, "{0}", value); diff --git a/Providers/FreeSql.Provider.Odbc/Default/OdbcUtils.cs b/Providers/FreeSql.Provider.Odbc/Default/OdbcUtils.cs index ebf3b993..64fd5d83 100644 --- a/Providers/FreeSql.Provider.Odbc/Default/OdbcUtils.cs +++ b/Providers/FreeSql.Provider.Odbc/Default/OdbcUtils.cs @@ -69,7 +69,7 @@ namespace FreeSql.Odbc.Default public override string QuoteWriteParamter(Type type, string paramterName) => paramterName; public override string QuoteReadColumn(Type type, Type mapType, string columnName) => Adapter.FieldSql(type, columnName); - public override string GetNoneParamaterSqlValue(List specialParams, Type type, object value) + public override string GetNoneParamaterSqlValue(List specialParams, string specialParamFlag, Type type, object value) { if (value == null) return "NULL"; if (type.IsNumberType()) return string.Format(CultureInfo.InvariantCulture, "{0}", value); diff --git a/Providers/FreeSql.Provider.Odbc/KingbaseES/Curd/OdbcKingbaseESInsertOrUpdate.cs b/Providers/FreeSql.Provider.Odbc/KingbaseES/Curd/OdbcKingbaseESInsertOrUpdate.cs index d4258280..7eaf2fee 100644 --- a/Providers/FreeSql.Provider.Odbc/KingbaseES/Curd/OdbcKingbaseESInsertOrUpdate.cs +++ b/Providers/FreeSql.Provider.Odbc/KingbaseES/Curd/OdbcKingbaseESInsertOrUpdate.cs @@ -37,6 +37,7 @@ namespace FreeSql.Odbc.KingbaseES .WithTransaction(_transaction) .NoneParameter(true) as Internal.CommonProvider.InsertProvider; insert._source = data; + insert._noneParameterFlag = flagInsert ? "cuc" : "cu"; string sql = ""; if (IdentityColumn != null && flagInsert) sql = insert.ToSql(); diff --git a/Providers/FreeSql.Provider.Odbc/KingbaseES/Curd/OdbcKingbaseESOnConflictDoUpdate.cs b/Providers/FreeSql.Provider.Odbc/KingbaseES/Curd/OdbcKingbaseESOnConflictDoUpdate.cs index 432020c1..d8802705 100644 --- a/Providers/FreeSql.Provider.Odbc/KingbaseES/Curd/OdbcKingbaseESOnConflictDoUpdate.cs +++ b/Providers/FreeSql.Provider.Odbc/KingbaseES/Curd/OdbcKingbaseESOnConflictDoUpdate.cs @@ -24,6 +24,7 @@ namespace FreeSql.Odbc.KingbaseES { _pgsqlInsert = insert as OdbcKingbaseESInsert; if (_pgsqlInsert == null) throw new Exception("OnConflictDoUpdate 鏄 FreeSql.Provider.Odbc/KingbaseES 鐗规湁鐨勫姛鑳"); + if (_pgsqlInsert._noneParameterFlag == "c") _pgsqlInsert._noneParameterFlag = "cu"; if (columns != null) { diff --git a/Providers/FreeSql.Provider.Odbc/KingbaseES/OdbcKingbaseESUtils.cs b/Providers/FreeSql.Provider.Odbc/KingbaseES/OdbcKingbaseESUtils.cs index f46f3c13..b1a3a680 100644 --- a/Providers/FreeSql.Provider.Odbc/KingbaseES/OdbcKingbaseESUtils.cs +++ b/Providers/FreeSql.Provider.Odbc/KingbaseES/OdbcKingbaseESUtils.cs @@ -123,7 +123,7 @@ namespace FreeSql.Odbc.KingbaseES public override string QuoteWriteParamter(Type type, string paramterName) => paramterName; public override string QuoteReadColumn(Type type, Type mapType, string columnName) => columnName; - public override string GetNoneParamaterSqlValue(List specialParams, Type type, object value) + public override string GetNoneParamaterSqlValue(List specialParams, string specialParamFlag, Type type, object value) { if (value == null) return "NULL"; if (type.IsNumberType()) return string.Format(CultureInfo.InvariantCulture, "{0}", value); @@ -145,7 +145,7 @@ namespace FreeSql.Odbc.KingbaseES { var item = valueArr.GetValue(a); if (a > 0) sb.Append(","); - sb.Append(GetNoneParamaterSqlValue(specialParams, eleType, item)); + sb.Append(GetNoneParamaterSqlValue(specialParams, specialParamFlag, eleType, item)); } sb.Append("]"); var dbinfo = _orm.CodeFirst.GetDbInfo(type); diff --git a/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlInsertOrUpdate.cs b/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlInsertOrUpdate.cs index 38c5dfab..822fb089 100644 --- a/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlInsertOrUpdate.cs +++ b/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlInsertOrUpdate.cs @@ -36,6 +36,7 @@ namespace FreeSql.Odbc.MySql .WithTransaction(_transaction) .NoneParameter(true) as Internal.CommonProvider.InsertProvider; insert._source = data; + insert._noneParameterFlag = flagInsert ? "cuc" : "cu"; string sql = ""; if (IdentityColumn != null && flagInsert) sql = insert.ToSql(); diff --git a/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlOnDuplicateKeyUpdate.cs b/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlOnDuplicateKeyUpdate.cs index cc4649fb..5d12c106 100644 --- a/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlOnDuplicateKeyUpdate.cs +++ b/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlOnDuplicateKeyUpdate.cs @@ -17,6 +17,7 @@ namespace FreeSql.Odbc.MySql { _mysqlInsert = insert as OdbcMySqlInsert; if (_mysqlInsert == null) throw new Exception("OnDuplicateKeyUpdate 鏄 FreeSql.Provider.Odbc/MySql 鐗规湁鐨勫姛鑳"); + if (_mysqlInsert._noneParameterFlag == "c") _mysqlInsert._noneParameterFlag = "cu"; } protected void ClearData() diff --git a/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlUtils.cs b/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlUtils.cs index 6ce28f10..dc65db27 100644 --- a/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlUtils.cs +++ b/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlUtils.cs @@ -93,7 +93,7 @@ namespace FreeSql.Odbc.MySql return columnName; } - public override string GetNoneParamaterSqlValue(List specialParams, Type type, object value) + public override string GetNoneParamaterSqlValue(List specialParams, string specialParamFlag, Type type, object value) { if (value == null) return "NULL"; if (type.IsNumberType()) return string.Format(CultureInfo.InvariantCulture, "{0}", value); diff --git a/Providers/FreeSql.Provider.Odbc/Oracle/Curd/OdbcOracleInsert.cs b/Providers/FreeSql.Provider.Odbc/Oracle/Curd/OdbcOracleInsert.cs index f4ea0596..2f73dc42 100644 --- a/Providers/FreeSql.Provider.Odbc/Oracle/Curd/OdbcOracleInsert.cs +++ b/Providers/FreeSql.Provider.Odbc/Oracle/Curd/OdbcOracleInsert.cs @@ -69,7 +69,7 @@ namespace FreeSql.Odbc.Oracle object val = col.GetMapValue(d); if (val == null && col.Attribute.IsNullable == false) val = col.CsType == typeof(string) ? "" : Utils.GetDataReaderValue(col.CsType.NullableTypeOrThis(), null);//#384 if (_noneParameter) - sb.Append(_commonUtils.GetNoneParamaterSqlValue(specialParams, col.Attribute.MapType, val)); + sb.Append(_commonUtils.GetNoneParamaterSqlValue(specialParams, _noneParameterFlag, col.Attribute.MapType, val)); else { sb.Append(_commonUtils.QuoteWriteParamter(col.Attribute.MapType, _commonUtils.QuoteParamterName($"{col.CsName}_{didx}"))); @@ -81,6 +81,7 @@ namespace FreeSql.Odbc.Oracle sb.Append(")"); ++didx; } + if (_noneParameter && specialParams.Any()) _params = specialParams.ToArray(); if (_source.Count > 1) sb.Append("\r\n SELECT 1 FROM DUAL"); return sb.ToString(); } diff --git a/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleUtils.cs b/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleUtils.cs index dddeda5f..1279be50 100644 --- a/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleUtils.cs +++ b/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleUtils.cs @@ -99,11 +99,30 @@ namespace FreeSql.Odbc.Oracle public override string QuoteWriteParamter(Type type, string paramterName) => paramterName; public override string QuoteReadColumn(Type type, Type mapType, string columnName) => columnName; - public override string GetNoneParamaterSqlValue(List specialParams, Type type, object value) + public override string GetNoneParamaterSqlValue(List specialParams, string specialParamFlag, Type type, object value) { if (value == null) return "NULL"; if (type.IsNumberType()) return string.Format(CultureInfo.InvariantCulture, "{0}", value); - if (type == typeof(byte[])) return $"hextoraw('{CommonUtils.BytesSqlRaw(value as byte[])}')"; + if (type == typeof(string)) + { + var valueString = value as string; + if (valueString != null) + { + if (valueString.Length < 4000) return string.Concat("'", valueString.Replace("'", "''"), "'"); + var pam = AppendParamter(specialParams, $"p_{specialParams?.Count}{specialParamFlag}", null, type, value); + return pam.ParameterName; + } + } + if (type == typeof(byte[])) + { + var valueBytes = value as byte[]; + if (valueBytes != null) + { + if (valueBytes.Length < 4000) return $"hextoraw('{CommonUtils.BytesSqlRaw(valueBytes)}')"; + var pam = AppendParamter(specialParams, $"p_{specialParams?.Count}{specialParamFlag}", null, type, value); + return pam.ParameterName; + } + } return FormatSql("{0}", value, 1); } } diff --git a/Providers/FreeSql.Provider.Odbc/PostgreSQL/Curd/OdbcPostgreSQLInsertOrUpdate.cs b/Providers/FreeSql.Provider.Odbc/PostgreSQL/Curd/OdbcPostgreSQLInsertOrUpdate.cs index c709a6d3..8f438e22 100644 --- a/Providers/FreeSql.Provider.Odbc/PostgreSQL/Curd/OdbcPostgreSQLInsertOrUpdate.cs +++ b/Providers/FreeSql.Provider.Odbc/PostgreSQL/Curd/OdbcPostgreSQLInsertOrUpdate.cs @@ -35,6 +35,7 @@ namespace FreeSql.Odbc.PostgreSQL .WithTransaction(_transaction) .NoneParameter(true) as Internal.CommonProvider.InsertProvider; insert._source = data; + insert._noneParameterFlag = flagInsert ? "cuc" : "cu"; string sql = ""; if (IdentityColumn != null && flagInsert) sql = insert.ToSql(); diff --git a/Providers/FreeSql.Provider.Odbc/PostgreSQL/Curd/OdbcPostgreSQLOnConflictDoUpdate.cs b/Providers/FreeSql.Provider.Odbc/PostgreSQL/Curd/OdbcPostgreSQLOnConflictDoUpdate.cs index 4d59b8af..879bba71 100644 --- a/Providers/FreeSql.Provider.Odbc/PostgreSQL/Curd/OdbcPostgreSQLOnConflictDoUpdate.cs +++ b/Providers/FreeSql.Provider.Odbc/PostgreSQL/Curd/OdbcPostgreSQLOnConflictDoUpdate.cs @@ -24,6 +24,7 @@ namespace FreeSql.Odbc.PostgreSQL { _pgsqlInsert = insert as OdbcPostgreSQLInsert; if (_pgsqlInsert == null) throw new Exception("OnConflictDoUpdate 鏄 FreeSql.Provider.Odbc/PostgreSQL 鐗规湁鐨勫姛鑳"); + if (_pgsqlInsert._noneParameterFlag == "c") _pgsqlInsert._noneParameterFlag = "cu"; if (columns != null) { diff --git a/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLUtils.cs b/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLUtils.cs index 1182028e..c65c1788 100644 --- a/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLUtils.cs +++ b/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLUtils.cs @@ -123,7 +123,7 @@ namespace FreeSql.Odbc.PostgreSQL public override string QuoteWriteParamter(Type type, string paramterName) => paramterName; public override string QuoteReadColumn(Type type, Type mapType, string columnName) => columnName; - public override string GetNoneParamaterSqlValue(List specialParams, Type type, object value) + public override string GetNoneParamaterSqlValue(List specialParams, string specialParamFlag, Type type, object value) { if (value == null) return "NULL"; if (type.IsNumberType()) return string.Format(CultureInfo.InvariantCulture, "{0}", value); @@ -145,7 +145,7 @@ namespace FreeSql.Odbc.PostgreSQL { var item = valueArr.GetValue(a); if (a > 0) sb.Append(","); - sb.Append(GetNoneParamaterSqlValue(specialParams, eleType, item)); + sb.Append(GetNoneParamaterSqlValue(specialParams, specialParamFlag, eleType, item)); } sb.Append("]"); var dbinfo = _orm.CodeFirst.GetDbInfo(type); diff --git a/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerUtils.cs b/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerUtils.cs index 214a7d1b..bb2fc858 100644 --- a/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerUtils.cs +++ b/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerUtils.cs @@ -86,7 +86,7 @@ namespace FreeSql.Odbc.SqlServer public override string QuoteWriteParamter(Type type, string paramterName) => paramterName; public override string QuoteReadColumn(Type type, Type mapType, string columnName) => columnName; - public override string GetNoneParamaterSqlValue(List specialParams, Type type, object value) + public override string GetNoneParamaterSqlValue(List specialParams, string specialParamFlag, Type type, object value) { if (value == null) return "NULL"; if (type.IsNumberType()) return string.Format(CultureInfo.InvariantCulture, "{0}", value); diff --git a/Providers/FreeSql.Provider.Oracle/Curd/OracleInsert.cs b/Providers/FreeSql.Provider.Oracle/Curd/OracleInsert.cs index 371191d9..04c8d2ad 100644 --- a/Providers/FreeSql.Provider.Oracle/Curd/OracleInsert.cs +++ b/Providers/FreeSql.Provider.Oracle/Curd/OracleInsert.cs @@ -71,7 +71,7 @@ namespace FreeSql.Oracle.Curd object val = col.GetMapValue(d); if (val == null && col.Attribute.IsNullable == false) val = col.CsType == typeof(string) ? "" : Utils.GetDataReaderValue(col.CsType.NullableTypeOrThis(), null);//#384 if (_noneParameter) - sb.Append(_commonUtils.GetNoneParamaterSqlValue(specialParams, col.Attribute.MapType, val)); + sb.Append(_commonUtils.GetNoneParamaterSqlValue(specialParams, _noneParameterFlag, col.Attribute.MapType, val)); else { sb.Append(_commonUtils.QuoteWriteParamter(col.Attribute.MapType, _commonUtils.QuoteParamterName($"{col.CsName}_{didx}"))); @@ -83,6 +83,7 @@ namespace FreeSql.Oracle.Curd sb.Append(")"); ++didx; } + if (_noneParameter && specialParams.Any()) _params = specialParams.ToArray(); if (_source.Count > 1) sb.Append("\r\n SELECT 1 FROM DUAL"); return sb.ToString(); } diff --git a/Providers/FreeSql.Provider.Oracle/OracleUtils.cs b/Providers/FreeSql.Provider.Oracle/OracleUtils.cs index 90121043..c6eaca38 100644 --- a/Providers/FreeSql.Provider.Oracle/OracleUtils.cs +++ b/Providers/FreeSql.Provider.Oracle/OracleUtils.cs @@ -98,11 +98,30 @@ namespace FreeSql.Oracle public override string QuoteWriteParamter(Type type, string paramterName) => paramterName; public override string QuoteReadColumn(Type type, Type mapType, string columnName) => columnName; - public override string GetNoneParamaterSqlValue(List specialParams, Type type, object value) + public override string GetNoneParamaterSqlValue(List specialParams, string specialParamFlag, Type type, object value) { if (value == null) return "NULL"; if (type.IsNumberType()) return string.Format(CultureInfo.InvariantCulture, "{0}", value); - if (type == typeof(byte[])) return $"hextoraw('{CommonUtils.BytesSqlRaw(value as byte[])}')"; + if (type == typeof(string)) + { + var valueString = value as string; + if (valueString != null) + { + if (valueString.Length < 4000) return string.Concat("'", valueString.Replace("'", "''"), "'"); + var pam = AppendParamter(specialParams, $"p_{specialParams?.Count}{specialParamFlag}", null, type, value); + return pam.ParameterName; + } + } + if (type == typeof(byte[])) + { + var valueBytes = value as byte[]; + if (valueBytes != null) + { + if (valueBytes.Length < 4000) return $"hextoraw('{CommonUtils.BytesSqlRaw(valueBytes)}')"; + var pam = AppendParamter(specialParams, $"p_{specialParams?.Count}{specialParamFlag}", null, type, value); + return pam.ParameterName; + } + } return FormatSql("{0}", value, 1); } } diff --git a/Providers/FreeSql.Provider.PostgreSQL/Curd/OnConflictDoUpdate.cs b/Providers/FreeSql.Provider.PostgreSQL/Curd/OnConflictDoUpdate.cs index 2fbdf279..cc02ec6c 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/Curd/OnConflictDoUpdate.cs +++ b/Providers/FreeSql.Provider.PostgreSQL/Curd/OnConflictDoUpdate.cs @@ -24,6 +24,7 @@ namespace FreeSql.PostgreSQL.Curd { _pgsqlInsert = insert as PostgreSQLInsert; if (_pgsqlInsert == null) throw new Exception("OnConflictDoUpdate 鏄 FreeSql.Provider.PostgreSQL 鐗规湁鐨勫姛鑳"); + if (_pgsqlInsert._noneParameterFlag == "c") _pgsqlInsert._noneParameterFlag = "cu"; if (columns != null) { diff --git a/Providers/FreeSql.Provider.PostgreSQL/Curd/PostgreSQLInsertOrUpdate.cs b/Providers/FreeSql.Provider.PostgreSQL/Curd/PostgreSQLInsertOrUpdate.cs index 7af97ef1..6d5a6291 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/Curd/PostgreSQLInsertOrUpdate.cs +++ b/Providers/FreeSql.Provider.PostgreSQL/Curd/PostgreSQLInsertOrUpdate.cs @@ -35,6 +35,7 @@ namespace FreeSql.PostgreSQL.Curd .WithTransaction(_transaction) .NoneParameter(true) as Internal.CommonProvider.InsertProvider; insert._source = data; + insert._noneParameterFlag = flagInsert ? "cuc" : "cu"; string sql = ""; if (IdentityColumn != null && flagInsert) sql = insert.ToSql(); diff --git a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLUtils.cs b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLUtils.cs index 30d9422c..bf384eda 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLUtils.cs +++ b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLUtils.cs @@ -163,7 +163,7 @@ namespace FreeSql.PostgreSQL public override string QuoteReadColumn(Type type, Type mapType, string columnName) => columnName; static ConcurrentDictionary _dicIsAssignableFromPostgisGeometry = new ConcurrentDictionary(); - public override string GetNoneParamaterSqlValue(List specialParams, Type type, object value) + public override string GetNoneParamaterSqlValue(List specialParams, string specialParamFlag, Type type, object value) { if (value == null) return "NULL"; if (type.IsNumberType()) return string.Format(CultureInfo.InvariantCulture, "{0}", value); @@ -178,7 +178,7 @@ namespace FreeSql.PostgreSQL ; })) { - var pam = AppendParamter(specialParams, null, null, type, value); + var pam = AppendParamter(specialParams, $"p_{specialParams?.Count}{specialParamFlag}", null, type, value); return pam.ParameterName; } value = getParamterValue(type, value); @@ -199,7 +199,7 @@ namespace FreeSql.PostgreSQL { var item = valueArr.GetValue(a); if (a > 0) sb.Append(","); - sb.Append(GetNoneParamaterSqlValue(specialParams, eleType, item)); + sb.Append(GetNoneParamaterSqlValue(specialParams, specialParamFlag, eleType, item)); } sb.Append("]"); var dbinfo = _orm.CodeFirst.GetDbInfo(type); diff --git a/Providers/FreeSql.Provider.ShenTong/Curd/OnConflictDoUpdate.cs b/Providers/FreeSql.Provider.ShenTong/Curd/OnConflictDoUpdate.cs deleted file mode 100644 index 7857f92f..00000000 --- a/Providers/FreeSql.Provider.ShenTong/Curd/OnConflictDoUpdate.cs +++ /dev/null @@ -1,207 +0,0 @@ -锘縰sing FreeSql.Aop; -using FreeSql.Internal.Model; -using System; -using System.Collections.Generic; -using System.Data; -using System.Linq; -using System.Linq.Expressions; -using System.Text; -using System.Threading.Tasks; - -namespace FreeSql.ShenTong.Curd -{ - public class OnConflictDoUpdate where T1 : class - { - internal ShenTongInsert _oscarInsert; - internal ShenTongUpdate _oscarUpdatePriv; - internal ShenTongUpdate _oscarUpdate => _oscarUpdatePriv ?? - (_oscarUpdatePriv = new ShenTongUpdate(_oscarInsert.InternalOrm, _oscarInsert.InternalCommonUtils, _oscarInsert.InternalCommonExpression, null) { InternalTableAlias = "EXCLUDED" } - .NoneParameter().SetSource(_oscarInsert.InternalSource) as ShenTongUpdate); - ColumnInfo[] _columns; - bool _doNothing; - - public OnConflictDoUpdate(IInsert insert, Expression> columns = null) - { - _oscarInsert = insert as ShenTongInsert; - if (_oscarInsert == null) throw new Exception("OnConflictDoUpdate 鏄 FreeSql.Provider.ShenTong 鐗规湁鐨勫姛鑳"); - - if (columns != null) - { - var colsList = new List(); - var cols = _oscarInsert.InternalCommonExpression.ExpressionSelectColumns_MemberAccess_New_NewArrayInit(null, columns?.Body, false, null).ToDictionary(a => a, a => true); - foreach (var col in _oscarInsert.InternalTable.Columns.Values) - if (cols.ContainsKey(col.Attribute.Name)) - colsList.Add(col); - _columns = colsList.ToArray(); - } - if (_columns == null || _columns.Any() == false) - _columns = _oscarInsert.InternalTable.Primarys; - if (_columns.Any() == false) throw new Exception("OnConflictDoUpdate 鍔熻兘瑕佹眰瀹炰綋绫诲繀椤昏缃 IsPrimary 灞炴"); - } - - protected void ClearData() - { - _oscarInsert.InternalClearData(); - _oscarUpdatePriv = null; - } - - public OnConflictDoUpdate IgnoreColumns(Expression> columns) - { - _oscarUpdate.IgnoreColumns(columns); - return this; - } - public OnConflictDoUpdate UpdateColumns(Expression> columns) - { - _oscarUpdate.UpdateColumns(columns); - return this; - } - public OnConflictDoUpdate IgnoreColumns(string[] columns) - { - _oscarUpdate.IgnoreColumns(columns); - return this; - } - public OnConflictDoUpdate UpdateColumns(string[] columns) - { - _oscarUpdate.UpdateColumns(columns); - return this; - } - - public OnConflictDoUpdate Set(Expression> column, TMember value) - { - _oscarUpdate.Set(column, value); - return this; - } - //鐢变簬琛ㄨ揪寮忚В鏋愰棶棰橈紝ON CONFLICT("id") DO UPDATE SET 闇瑕佹寚瀹氳〃鍒悕锛屽 Set(a => a.Clicks + 1) 瑙f瀽浼氬け璐 - //鏆傛椂涓嶅紑鏀捐繖涓姛鑳斤紝濡傛湁闇瑕佷娇鐢 SetRaw("click = t.click + 1") 鏇夸唬璇ユ搷浣 - //public OnConflictDoUpdate Set(Expression> exp) - //{ - // _oscarUpdate.Set(exp); - // return this; - //} - public OnConflictDoUpdate SetRaw(string sql) - { - _oscarUpdate.SetRaw(sql); - return this; - } - - public OnConflictDoUpdate DoNothing() - { - _doNothing = true; - return this; - } - - public string ToSql() - { - var sb = new StringBuilder(); - sb.Append(_oscarInsert.ToSql()).Append("\r\nON CONFLICT("); - for (var a = 0; a < _columns.Length; a++) - { - if (a > 0) sb.Append(", "); - sb.Append(_oscarInsert.InternalCommonUtils.QuoteSqlName(_columns[a].Attribute.Name)); - } - if (_doNothing) - { - sb.Append(") DO NOTHING"); - } - else - { - sb.Append(") DO UPDATE SET\r\n"); - - var sbSetEmpty = _oscarUpdate.InternalSbSet.Length == 0; - var sbSetIncrEmpty = _oscarUpdate.InternalSbSetIncr.Length == 0; - if (sbSetEmpty == false || sbSetIncrEmpty == false) - { - if (sbSetEmpty == false) sb.Append(_oscarUpdate.InternalSbSet.ToString().Substring(2)); - if (sbSetIncrEmpty == false) sb.Append(sbSetEmpty ? _oscarUpdate.InternalSbSetIncr.ToString().Substring(2) : _oscarUpdate.InternalSbSetIncr.ToString()); - } - else - { - var colidx = 0; - foreach (var col in _oscarInsert.InternalTable.Columns.Values) - { - if (col.Attribute.IsPrimary || _oscarUpdate.InternalIgnore.ContainsKey(col.Attribute.Name)) continue; - - if (colidx > 0) sb.Append(", \r\n"); - - if (col.Attribute.IsVersion == true) - { - var field = _oscarInsert.InternalCommonUtils.QuoteSqlName(col.Attribute.Name); - sb.Append(field).Append(" = ").Append(_oscarInsert.InternalCommonUtils.QuoteSqlName(_oscarInsert.InternalTable.DbName)).Append(".").Append(field).Append(" + 1"); - } - else if (_oscarInsert.InternalIgnore.ContainsKey(col.Attribute.Name)) - { - var caseWhen = _oscarUpdate.InternalWhereCaseSource(col.CsName, sqlval => sqlval).Trim(); - sb.Append(caseWhen); - if (caseWhen.EndsWith(" END")) _oscarUpdate.InternalToSqlCaseWhenEnd(sb, col); - } - else - { - var field = _oscarInsert.InternalCommonUtils.QuoteSqlName(col.Attribute.Name); - sb.Append(field).Append(" = EXCLUDED.").Append(field); - } - ++colidx; - } - } - } - - return sb.ToString(); - } - - public long ExecuteAffrows() - { - var sql = this.ToSql(); - if (string.IsNullOrEmpty(sql)) return 0; - - var before = new CurdBeforeEventArgs(_oscarInsert.InternalTable.Type, _oscarInsert.InternalTable, CurdType.Insert, sql, _oscarInsert.InternalParams); - _oscarInsert.InternalOrm.Aop.CurdBeforeHandler?.Invoke(_oscarInsert, before); - long ret = 0; - Exception exception = null; - try - { - ret = _oscarInsert.InternalOrm.Ado.ExecuteNonQuery(_oscarInsert.InternalConnection, _oscarInsert.InternalTransaction, CommandType.Text, sql, _oscarInsert.InternalParams); - } - catch (Exception ex) - { - exception = ex; - throw ex; - } - finally - { - var after = new CurdAfterEventArgs(before, exception, ret); - _oscarInsert.InternalOrm.Aop.CurdAfterHandler?.Invoke(_oscarInsert, after); - ClearData(); - } - return ret; - } - -#if net40 -#else - async public Task ExecuteAffrowsAsync() - { - var sql = this.ToSql(); - if (string.IsNullOrEmpty(sql)) return 0; - - var before = new CurdBeforeEventArgs(_oscarInsert.InternalTable.Type, _oscarInsert.InternalTable, CurdType.Insert, sql, _oscarInsert.InternalParams); - _oscarInsert.InternalOrm.Aop.CurdBeforeHandler?.Invoke(_oscarInsert, before); - long ret = 0; - Exception exception = null; - try - { - ret = await _oscarInsert.InternalOrm.Ado.ExecuteNonQueryAsync(_oscarInsert.InternalConnection, _oscarInsert.InternalTransaction, CommandType.Text, sql, _oscarInsert.InternalParams); - } - catch (Exception ex) - { - exception = ex; - throw ex; - } - finally - { - var after = new CurdAfterEventArgs(before, exception, ret); - _oscarInsert.InternalOrm.Aop.CurdAfterHandler?.Invoke(_oscarInsert, after); - ClearData(); - } - return ret; - } -#endif - } -} diff --git a/Providers/FreeSql.Provider.ShenTong/ShenTongUtils.cs b/Providers/FreeSql.Provider.ShenTong/ShenTongUtils.cs index bf0e67f4..b29ce343 100644 --- a/Providers/FreeSql.Provider.ShenTong/ShenTongUtils.cs +++ b/Providers/FreeSql.Provider.ShenTong/ShenTongUtils.cs @@ -137,7 +137,7 @@ namespace FreeSql.ShenTong public override string QuoteWriteParamter(Type type, string paramterName) => paramterName; public override string QuoteReadColumn(Type type, Type mapType, string columnName) => columnName; - public override string GetNoneParamaterSqlValue(List specialParams, Type type, object value) + public override string GetNoneParamaterSqlValue(List specialParams, string specialParamFlag, Type type, object value) { if (value == null) return "NULL"; if (type.IsNumberType()) return string.Format(CultureInfo.InvariantCulture, "{0}", value); @@ -161,7 +161,7 @@ namespace FreeSql.ShenTong { var item = valueArr.GetValue(a); if (a > 0) sb.Append(","); - sb.Append(GetNoneParamaterSqlValue(specialParams, eleType, item)); + sb.Append(GetNoneParamaterSqlValue(specialParams, specialParamFlag, eleType, item)); } sb.Append("]"); var dbinfo = _orm.CodeFirst.GetDbInfo(type); diff --git a/Providers/FreeSql.Provider.SqlServer/SqlServerUtils.cs b/Providers/FreeSql.Provider.SqlServer/SqlServerUtils.cs index be0468f3..88a36219 100644 --- a/Providers/FreeSql.Provider.SqlServer/SqlServerUtils.cs +++ b/Providers/FreeSql.Provider.SqlServer/SqlServerUtils.cs @@ -102,7 +102,7 @@ namespace FreeSql.SqlServer public override string QuoteWriteParamter(Type type, string paramterName) => paramterName; public override string QuoteReadColumn(Type type, Type mapType, string columnName) => columnName; - public override string GetNoneParamaterSqlValue(List specialParams, Type type, object value) + public override string GetNoneParamaterSqlValue(List specialParams, string specialParamFlag, Type type, object value) { if (value == null) return "NULL"; if (type.IsNumberType()) return string.Format(CultureInfo.InvariantCulture, "{0}", value); diff --git a/Providers/FreeSql.Provider.Sqlite/Curd/SqliteInsertOrUpdate.cs b/Providers/FreeSql.Provider.Sqlite/Curd/SqliteInsertOrUpdate.cs index 2e0b442e..b6b4422e 100644 --- a/Providers/FreeSql.Provider.Sqlite/Curd/SqliteInsertOrUpdate.cs +++ b/Providers/FreeSql.Provider.Sqlite/Curd/SqliteInsertOrUpdate.cs @@ -35,6 +35,7 @@ namespace FreeSql.Sqlite.Curd .WithConnection(_connection) .WithTransaction(_transaction) .NoneParameter(true) as Internal.CommonProvider.InsertProvider; + insert._noneParameterFlag = flagInsert ? "c" : "cu"; insert._source = data; string sql = ""; diff --git a/Providers/FreeSql.Provider.Sqlite/SqliteUtils.cs b/Providers/FreeSql.Provider.Sqlite/SqliteUtils.cs index 616b01ef..98ed34bd 100644 --- a/Providers/FreeSql.Provider.Sqlite/SqliteUtils.cs +++ b/Providers/FreeSql.Provider.Sqlite/SqliteUtils.cs @@ -98,10 +98,15 @@ namespace FreeSql.Sqlite public override string QuoteWriteParamter(Type type, string paramterName) => paramterName; public override string QuoteReadColumn(Type type, Type mapType, string columnName) => columnName; - public override string GetNoneParamaterSqlValue(List specialParams, Type type, object value) + public override string GetNoneParamaterSqlValue(List specialParams, string specialParamFlag, Type type, object value) { if (value == null) return "NULL"; if (type.IsNumberType()) return string.Format(CultureInfo.InvariantCulture, "{0}", value); + if (type == typeof(byte[])) + { + var pam = AppendParamter(specialParams, $"p_{specialParams?.Count}{specialParamFlag}", null, type, value); + return pam.ParameterName; + } return FormatSql("{0}", value, 1); } }