-
Notifications
You must be signed in to change notification settings - Fork 862
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
添加ClickHouse数据库 #943
添加ClickHouse数据库 #943
Conversation
谢谢贡献,近期审查合并一下,初步发现 Update 直接 Replace 的方式略显粗旷,因为有可能更新的内容也包括该内容 |
😊嗯嗯,想着尽量少改FreeSql源代码,外加基本不会使用到修改功能,所有...。 |
1、保存数据时,数据过长问题,可以适当使用参数化。 ClickHouseUtils.cs 可以处理特殊的参数化: public override string GetNoneParamaterSqlValue(List<DbParameter> specialParams, string specialParamFlag, ColumnInfo col, Type type, object value)
{
if (value == null) return "NULL";
if (type.IsNumberType()) return string.Format(CultureInfo.InvariantCulture, "{0}", value);
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);
} 以上代码大致意思:当字符串长度 >4000,或者 byte[] 类型,则强制使用参数化。 2、NULL 的问题,可能需要使用者自己注意了,NULL判断规则在许多数据库下都是这样逻辑。 |
这两个问题都已经解决了 |
只是在批量插入时,如果存在decimal类型字段,最后一位会产生精度丢失,但是这个是ado内部存在数值转换导致的,暂时没法解决 |
使用参数化写入 decimal 类型是否还会丢精? public override string GetNoneParamaterSqlValue(List<DbParameter> specialParams, string specialParamFlag, ColumnInfo col, Type type, object value)
{
if (value == null) return "NULL";
if (type.IsNumberType())
{
if (type == typeof(decimal))
{
var pam = AppendParamter(specialParams, $"p_{specialParams?.Count}{specialParamFlag}", null, type, value);
//pam.Precision = 10; 这两行可能需要调试
//pam.Scale = 2;
return pam.ParameterName;
}
return string.Format(CultureInfo.InvariantCulture, "{0}", value);
}
return FormatSql("{0}", value, 1);
} |
添加了ClickHouse数据库支持,可以合并吗