mirror of
				https://github.com/nsnail/FreeSql.git
				synced 2025-11-03 00:55:26 +08:00 
			
		
		
		
	- 优化 NoneParameter Oracle 文本超长的问题;
This commit is contained in:
		@@ -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();
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -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<DbParameter> specialParams, Type type, object value)
 | 
			
		||||
        public override string GetNoneParamaterSqlValue(List<DbParameter> specialParams, string specialParamFlag, Type type, object value)
 | 
			
		||||
        {
 | 
			
		||||
            if (value == null) return "NULL";
 | 
			
		||||
            if (type.IsNumberType()) return string.Format(CultureInfo.InvariantCulture, "{0}", value);
 | 
			
		||||
 
 | 
			
		||||
@@ -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<DbParameter> specialParams, Type type, object value)
 | 
			
		||||
        public override string GetNoneParamaterSqlValue(List<DbParameter> specialParams, string specialParamFlag, Type type, object value)
 | 
			
		||||
        {
 | 
			
		||||
            if (value == null) return "NULL";
 | 
			
		||||
            if (type.IsNumberType()) return string.Format(CultureInfo.InvariantCulture, "{0}", value);
 | 
			
		||||
 
 | 
			
		||||
@@ -37,6 +37,7 @@ namespace FreeSql.MySql.Curd
 | 
			
		||||
                    .WithTransaction(_transaction)
 | 
			
		||||
                    .NoneParameter(true) as Internal.CommonProvider.InsertProvider<T1>;
 | 
			
		||||
                insert._source = data;
 | 
			
		||||
                insert._noneParameterFlag = flagInsert ? "cuc" : "cu";
 | 
			
		||||
 | 
			
		||||
                string sql = "";
 | 
			
		||||
                if (IdentityColumn != null && flagInsert) sql = insert.ToSql();
 | 
			
		||||
 
 | 
			
		||||
@@ -17,6 +17,7 @@ namespace FreeSql.MySql.Curd
 | 
			
		||||
        {
 | 
			
		||||
            _mysqlInsert = insert as MySqlInsert<T1>;
 | 
			
		||||
            if (_mysqlInsert == null) throw new Exception("OnDuplicateKeyUpdate 是 FreeSql.Provider.MySql/FreeSql.Provider.MySqlConnector 特有的功能");
 | 
			
		||||
            if (_mysqlInsert._noneParameterFlag == "c") _mysqlInsert._noneParameterFlag = "cu";
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        protected void ClearData()
 | 
			
		||||
 
 | 
			
		||||
@@ -126,7 +126,7 @@ namespace FreeSql.MySql
 | 
			
		||||
            return columnName;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override string GetNoneParamaterSqlValue(List<DbParameter> specialParams, Type type, object value)
 | 
			
		||||
        public override string GetNoneParamaterSqlValue(List<DbParameter> specialParams, string specialParamFlag, Type type, object value)
 | 
			
		||||
        {
 | 
			
		||||
            if (value == null) return "NULL";
 | 
			
		||||
            if (type.IsNumberType()) return string.Format(CultureInfo.InvariantCulture, "{0}", value);
 | 
			
		||||
 
 | 
			
		||||
@@ -146,7 +146,7 @@ namespace FreeSql.MySql
 | 
			
		||||
            return columnName;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override string GetNoneParamaterSqlValue(List<DbParameter> specialParams, Type type, object value)
 | 
			
		||||
        public override string GetNoneParamaterSqlValue(List<DbParameter> specialParams, string specialParamFlag, Type type, object value)
 | 
			
		||||
        {
 | 
			
		||||
            if (value == null) return "NULL";
 | 
			
		||||
            if (type.IsNumberType()) return string.Format(CultureInfo.InvariantCulture, "{0}", value);
 | 
			
		||||
 
 | 
			
		||||
@@ -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();
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -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<DbParameter> specialParams, Type type, object value)
 | 
			
		||||
        public override string GetNoneParamaterSqlValue(List<DbParameter> specialParams, string specialParamFlag, Type type, object value)
 | 
			
		||||
        {
 | 
			
		||||
            if (value == null) return "NULL";
 | 
			
		||||
            if (type.IsNumberType()) return string.Format(CultureInfo.InvariantCulture, "{0}", value);
 | 
			
		||||
 
 | 
			
		||||
@@ -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<DbParameter> specialParams, Type type, object value)
 | 
			
		||||
        public override string GetNoneParamaterSqlValue(List<DbParameter> specialParams, string specialParamFlag, Type type, object value)
 | 
			
		||||
        {
 | 
			
		||||
            if (value == null) return "NULL";
 | 
			
		||||
            if (type.IsNumberType()) return string.Format(CultureInfo.InvariantCulture, "{0}", value);
 | 
			
		||||
 
 | 
			
		||||
@@ -37,6 +37,7 @@ namespace FreeSql.Odbc.KingbaseES
 | 
			
		||||
                    .WithTransaction(_transaction)
 | 
			
		||||
                    .NoneParameter(true) as Internal.CommonProvider.InsertProvider<T1>;
 | 
			
		||||
                insert._source = data;
 | 
			
		||||
                insert._noneParameterFlag = flagInsert ? "cuc" : "cu";
 | 
			
		||||
 | 
			
		||||
                string sql = "";
 | 
			
		||||
                if (IdentityColumn != null && flagInsert) sql = insert.ToSql();
 | 
			
		||||
 
 | 
			
		||||
@@ -24,6 +24,7 @@ namespace FreeSql.Odbc.KingbaseES
 | 
			
		||||
        {
 | 
			
		||||
            _pgsqlInsert = insert as OdbcKingbaseESInsert<T1>;
 | 
			
		||||
            if (_pgsqlInsert == null) throw new Exception("OnConflictDoUpdate 是 FreeSql.Provider.Odbc/KingbaseES 特有的功能");
 | 
			
		||||
            if (_pgsqlInsert._noneParameterFlag == "c") _pgsqlInsert._noneParameterFlag = "cu";
 | 
			
		||||
 | 
			
		||||
            if (columns != null)
 | 
			
		||||
            {
 | 
			
		||||
 
 | 
			
		||||
@@ -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<DbParameter> specialParams, Type type, object value)
 | 
			
		||||
        public override string GetNoneParamaterSqlValue(List<DbParameter> 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);
 | 
			
		||||
 
 | 
			
		||||
@@ -36,6 +36,7 @@ namespace FreeSql.Odbc.MySql
 | 
			
		||||
                    .WithTransaction(_transaction)
 | 
			
		||||
                    .NoneParameter(true) as Internal.CommonProvider.InsertProvider<T1>;
 | 
			
		||||
                insert._source = data;
 | 
			
		||||
                insert._noneParameterFlag = flagInsert ? "cuc" : "cu";
 | 
			
		||||
 | 
			
		||||
                string sql = "";
 | 
			
		||||
                if (IdentityColumn != null && flagInsert) sql = insert.ToSql();
 | 
			
		||||
 
 | 
			
		||||
@@ -17,6 +17,7 @@ namespace FreeSql.Odbc.MySql
 | 
			
		||||
        {
 | 
			
		||||
            _mysqlInsert = insert as OdbcMySqlInsert<T1>;
 | 
			
		||||
            if (_mysqlInsert == null) throw new Exception("OnDuplicateKeyUpdate 是 FreeSql.Provider.Odbc/MySql 特有的功能");
 | 
			
		||||
            if (_mysqlInsert._noneParameterFlag == "c") _mysqlInsert._noneParameterFlag = "cu";
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        protected void ClearData()
 | 
			
		||||
 
 | 
			
		||||
@@ -93,7 +93,7 @@ namespace FreeSql.Odbc.MySql
 | 
			
		||||
            return columnName;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override string GetNoneParamaterSqlValue(List<DbParameter> specialParams, Type type, object value)
 | 
			
		||||
        public override string GetNoneParamaterSqlValue(List<DbParameter> specialParams, string specialParamFlag, Type type, object value)
 | 
			
		||||
        {
 | 
			
		||||
            if (value == null) return "NULL";
 | 
			
		||||
            if (type.IsNumberType()) return string.Format(CultureInfo.InvariantCulture, "{0}", value);
 | 
			
		||||
 
 | 
			
		||||
@@ -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();
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -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<DbParameter> specialParams, Type type, object value)
 | 
			
		||||
        public override string GetNoneParamaterSqlValue(List<DbParameter> 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);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -35,6 +35,7 @@ namespace FreeSql.Odbc.PostgreSQL
 | 
			
		||||
                    .WithTransaction(_transaction)
 | 
			
		||||
                    .NoneParameter(true) as Internal.CommonProvider.InsertProvider<T1>;
 | 
			
		||||
                insert._source = data;
 | 
			
		||||
                insert._noneParameterFlag = flagInsert ? "cuc" : "cu";
 | 
			
		||||
 | 
			
		||||
                string sql = "";
 | 
			
		||||
                if (IdentityColumn != null && flagInsert) sql = insert.ToSql();
 | 
			
		||||
 
 | 
			
		||||
@@ -24,6 +24,7 @@ namespace FreeSql.Odbc.PostgreSQL
 | 
			
		||||
        {
 | 
			
		||||
            _pgsqlInsert = insert as OdbcPostgreSQLInsert<T1>;
 | 
			
		||||
            if (_pgsqlInsert == null) throw new Exception("OnConflictDoUpdate 是 FreeSql.Provider.Odbc/PostgreSQL 特有的功能");
 | 
			
		||||
            if (_pgsqlInsert._noneParameterFlag == "c") _pgsqlInsert._noneParameterFlag = "cu";
 | 
			
		||||
 | 
			
		||||
            if (columns != null)
 | 
			
		||||
            {
 | 
			
		||||
 
 | 
			
		||||
@@ -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<DbParameter> specialParams, Type type, object value)
 | 
			
		||||
        public override string GetNoneParamaterSqlValue(List<DbParameter> 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);
 | 
			
		||||
 
 | 
			
		||||
@@ -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<DbParameter> specialParams, Type type, object value)
 | 
			
		||||
        public override string GetNoneParamaterSqlValue(List<DbParameter> specialParams, string specialParamFlag, Type type, object value)
 | 
			
		||||
        {
 | 
			
		||||
            if (value == null) return "NULL";
 | 
			
		||||
            if (type.IsNumberType()) return string.Format(CultureInfo.InvariantCulture, "{0}", value);
 | 
			
		||||
 
 | 
			
		||||
@@ -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();
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -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<DbParameter> specialParams, Type type, object value)
 | 
			
		||||
        public override string GetNoneParamaterSqlValue(List<DbParameter> 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);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -24,6 +24,7 @@ namespace FreeSql.PostgreSQL.Curd
 | 
			
		||||
        {
 | 
			
		||||
            _pgsqlInsert = insert as PostgreSQLInsert<T1>;
 | 
			
		||||
            if (_pgsqlInsert == null) throw new Exception("OnConflictDoUpdate 是 FreeSql.Provider.PostgreSQL 特有的功能");
 | 
			
		||||
            if (_pgsqlInsert._noneParameterFlag == "c") _pgsqlInsert._noneParameterFlag = "cu";
 | 
			
		||||
 | 
			
		||||
            if (columns != null)
 | 
			
		||||
            {
 | 
			
		||||
 
 | 
			
		||||
@@ -35,6 +35,7 @@ namespace FreeSql.PostgreSQL.Curd
 | 
			
		||||
                    .WithTransaction(_transaction)
 | 
			
		||||
                    .NoneParameter(true) as Internal.CommonProvider.InsertProvider<T1>;
 | 
			
		||||
                insert._source = data;
 | 
			
		||||
                insert._noneParameterFlag = flagInsert ? "cuc" : "cu";
 | 
			
		||||
 | 
			
		||||
                string sql = "";
 | 
			
		||||
                if (IdentityColumn != null && flagInsert) sql = insert.ToSql();
 | 
			
		||||
 
 | 
			
		||||
@@ -163,7 +163,7 @@ namespace FreeSql.PostgreSQL
 | 
			
		||||
        public override string QuoteReadColumn(Type type, Type mapType, string columnName) => columnName;
 | 
			
		||||
 | 
			
		||||
        static ConcurrentDictionary<Type, bool> _dicIsAssignableFromPostgisGeometry = new ConcurrentDictionary<Type, bool>();
 | 
			
		||||
        public override string GetNoneParamaterSqlValue(List<DbParameter> specialParams, Type type, object value)
 | 
			
		||||
        public override string GetNoneParamaterSqlValue(List<DbParameter> 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);
 | 
			
		||||
 
 | 
			
		||||
@@ -1,207 +0,0 @@
 | 
			
		||||
using 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<T1> where T1 : class
 | 
			
		||||
    {
 | 
			
		||||
        internal ShenTongInsert<T1> _oscarInsert;
 | 
			
		||||
        internal ShenTongUpdate<T1> _oscarUpdatePriv;
 | 
			
		||||
        internal ShenTongUpdate<T1> _oscarUpdate => _oscarUpdatePriv ?? 
 | 
			
		||||
            (_oscarUpdatePriv = new ShenTongUpdate<T1>(_oscarInsert.InternalOrm, _oscarInsert.InternalCommonUtils, _oscarInsert.InternalCommonExpression, null) { InternalTableAlias = "EXCLUDED" }
 | 
			
		||||
                .NoneParameter().SetSource(_oscarInsert.InternalSource) as ShenTongUpdate<T1>);
 | 
			
		||||
        ColumnInfo[] _columns;
 | 
			
		||||
        bool _doNothing;
 | 
			
		||||
 | 
			
		||||
        public OnConflictDoUpdate(IInsert<T1> insert, Expression<Func<T1, object>> columns = null)
 | 
			
		||||
        {
 | 
			
		||||
            _oscarInsert = insert as ShenTongInsert<T1>;
 | 
			
		||||
            if (_oscarInsert == null) throw new Exception("OnConflictDoUpdate 是 FreeSql.Provider.ShenTong 特有的功能");
 | 
			
		||||
 | 
			
		||||
            if (columns != null)
 | 
			
		||||
            {
 | 
			
		||||
                var colsList = new List<ColumnInfo>();
 | 
			
		||||
                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<T1> IgnoreColumns(Expression<Func<T1, object>> columns)
 | 
			
		||||
        {
 | 
			
		||||
            _oscarUpdate.IgnoreColumns(columns);
 | 
			
		||||
            return this;
 | 
			
		||||
        }
 | 
			
		||||
        public OnConflictDoUpdate<T1> UpdateColumns(Expression<Func<T1, object>> columns)
 | 
			
		||||
        {
 | 
			
		||||
            _oscarUpdate.UpdateColumns(columns);
 | 
			
		||||
            return this;
 | 
			
		||||
        }
 | 
			
		||||
        public OnConflictDoUpdate<T1> IgnoreColumns(string[] columns)
 | 
			
		||||
        {
 | 
			
		||||
            _oscarUpdate.IgnoreColumns(columns);
 | 
			
		||||
            return this;
 | 
			
		||||
        }
 | 
			
		||||
        public OnConflictDoUpdate<T1> UpdateColumns(string[] columns)
 | 
			
		||||
        {
 | 
			
		||||
            _oscarUpdate.UpdateColumns(columns);
 | 
			
		||||
            return this;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public OnConflictDoUpdate<T1> Set<TMember>(Expression<Func<T1, TMember>> column, TMember value)
 | 
			
		||||
        {
 | 
			
		||||
            _oscarUpdate.Set(column, value);
 | 
			
		||||
            return this;
 | 
			
		||||
        }
 | 
			
		||||
        //由于表达式解析问题,ON CONFLICT("id") DO UPDATE SET 需要指定表别名,如 Set(a => a.Clicks + 1) 解析会失败
 | 
			
		||||
        //暂时不开放这个功能,如有需要使用 SetRaw("click = t.click + 1") 替代该操作
 | 
			
		||||
        //public OnConflictDoUpdate<T1> Set<TMember>(Expression<Func<T1, TMember>> exp)
 | 
			
		||||
        //{
 | 
			
		||||
        //    _oscarUpdate.Set(exp);
 | 
			
		||||
        //    return this;
 | 
			
		||||
        //}
 | 
			
		||||
        public OnConflictDoUpdate<T1> SetRaw(string sql)
 | 
			
		||||
        {
 | 
			
		||||
            _oscarUpdate.SetRaw(sql);
 | 
			
		||||
            return this;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public OnConflictDoUpdate<T1> 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<long> 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
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -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<DbParameter> specialParams, Type type, object value)
 | 
			
		||||
        public override string GetNoneParamaterSqlValue(List<DbParameter> 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);
 | 
			
		||||
 
 | 
			
		||||
@@ -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<DbParameter> specialParams, Type type, object value)
 | 
			
		||||
        public override string GetNoneParamaterSqlValue(List<DbParameter> specialParams, string specialParamFlag, Type type, object value)
 | 
			
		||||
        {
 | 
			
		||||
            if (value == null) return "NULL";
 | 
			
		||||
            if (type.IsNumberType()) return string.Format(CultureInfo.InvariantCulture, "{0}", value);
 | 
			
		||||
 
 | 
			
		||||
@@ -35,6 +35,7 @@ namespace FreeSql.Sqlite.Curd
 | 
			
		||||
                    .WithConnection(_connection)
 | 
			
		||||
                    .WithTransaction(_transaction)
 | 
			
		||||
                    .NoneParameter(true) as Internal.CommonProvider.InsertProvider<T1>;
 | 
			
		||||
                insert._noneParameterFlag = flagInsert ? "c" : "cu";
 | 
			
		||||
                insert._source = data;
 | 
			
		||||
 | 
			
		||||
                string sql = "";
 | 
			
		||||
 
 | 
			
		||||
@@ -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<DbParameter> specialParams, Type type, object value)
 | 
			
		||||
        public override string GetNoneParamaterSqlValue(List<DbParameter> 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);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user