- 修复 ClickHouse 单条记录插入\t \n失败的 bug;

This commit is contained in:
2881099 2022-08-13 10:51:57 +08:00
parent b7c6db4f7a
commit ec6d1ffb37
4 changed files with 51 additions and 18 deletions

View File

@ -10,7 +10,7 @@ using XY.Model.Business;
using System.ComponentModel.DataAnnotations;
using FreeSql.DataAnnotations;
namespace FreeSql.Tests.MySql
namespace FreeSql.Tests.ClickHouse
{
public class ClickHouseTest1
{
@ -309,11 +309,38 @@ namespace FreeSql.Tests.MySql
[Fact]
public void TestInsertNoneParameter()
{
var json = "[{\"date\":\"2021-12-19T02:47:53.4365075 08:00\",\"temperatureC\":6,\"temperatureF\":42,\"summary\":\"Balmy\"},{\"date\":\"2021-12-20T02:47:53.4366893 08:00\",\"temperatureC\":36,\"temperatureF\":96,\"summary\":\"Bracing\"},{\"date\":\"2021-12-21T02:47:53.4366903 08:00\",\"temperatureC\":-15,\"temperatureF\":6,\"summary\":\"Bracing\"},{\"date\":\"2021-12-22T02:47:53.4366904 08:00\",\"temperatureC\":14,\"temperatureF\":57,\"summary\":\"Cool\"},{\"date\":\"2021-12-23T02:47:53.4366905 08:00\",\"temperatureC\":29,\"temperatureF\":84,\"summary\":\"Mild\"}]";
var json = "[{\"date\":\t\"2021-12-19T02:47:53.4365075 08:00\",\"temperatureC\":6,\"temperatureF\":42,\"summary\":\"Balmy\"},{\"date\":\"2021-12-20T02:47:53.4366893 08:00\",\"temperatureC\":36,\"temperatureF\":96,\"summary\":\"Bracing\"},{\"date\":\"2021-12-21T02:47:53.4366903 08:00\",\"temperatureC\":-15,\"temperatureF\":6,\"summary\":\"Bracing\"},{\"date\":\"2021-12-22T02:47:53.4366904 08:00\",\"temperatureC\":14,\"temperatureF\":57,\"summary\":\"Cool\"},{\"date\":\"2021-12-23T02:47:53.4366905 08:00\",\"temperatureC\":29,\"temperatureF\":84,\"summary\":\"Mild\"}]";
var data = new Entity { Id = Guid.NewGuid().ToString(), Content = json };
var fsql = g.clickHouse;
fsql.Insert(data).NoneParameter().ExecuteAffrows();
var item = fsql.Select<Entity>().Where(a => a.Id == data.Id).First();
Assert.Equal(item.Content, json);
}
[Fact]
public void TestInsertUseParameter()
{
var fsql = g.clickHouse;
fsql.CodeFirst.SyncStructure<Entity>();
var json = "[{\"date\":\t\"2021-12-19T02:47:53.4365075 08:00\",\"temperatureC\":6,\"temperatureF\":42,\"summary\":\"Balmy\"},{\"date\":\"2021-12-20T02:47:53.4366893 08:00\",\"temperatureC\":36,\"temperatureF\":96,\"summary\":\"Bracing\"},{\"date\":\"2021-12-21T02:47:53.4366903 08:00\",\"temperatureC\":-15,\"temperatureF\":6,\"summary\":\"Bracing\"},{\"date\":\"2021-12-22T02:47:53.4366904 08:00\",\"temperatureC\":14,\"temperatureF\":57,\"summary\":\"Cool\"},{\"date\":\"2021-12-23T02:47:53.4366905 08:00\",\"temperatureC\":29,\"temperatureF\":84,\"summary\":\"Mild\"}]";
var data = new Entity { Id = Guid.NewGuid().ToString(), Content = json };
var sql1 = fsql.Insert(data).ToSql();
fsql.Insert(data).ExecuteAffrows();
var item = fsql.Select<Entity>().Where(a => a.Id == data.Id).First();
Assert.Equal(item.Content, json);
var data2 = new[]{
new Entity { Id = Guid.NewGuid().ToString(), Content = json },
new Entity { Id = Guid.NewGuid().ToString(), Content = json }
};
var sql2 = fsql.Insert(data2).ToSql();
fsql.Insert(data2).ExecuteAffrows();
item = fsql.Select<Entity>().Where(a => a.Id == data2[0].Id).First();
Assert.Equal(item.Content, json);
item = fsql.Select<Entity>().Where(a => a.Id == data2[1].Id).First();
Assert.Equal(item.Content, json);
}
}
}

View File

@ -4,11 +4,6 @@
<name>FreeSql.Tests</name>
</assembly>
<members>
<member name="M:FreeSql.Tests.MySql.MySqlCodeFirstTest.Tb_alltype.Save">
<summary>
保存或添加,如果主键有值则尝试 Update如果影响的行为 0 则尝试 Insert
</summary>
</member>
<member name="P:FreeSql.Tests.Firebird.FirebirdCodeFirstTest.AddUniquesInfo.id">
<summary>
编号
@ -432,6 +427,11 @@
修改人
</summary>
</member>
<member name="M:FreeSql.Tests.MySql.MySqlCodeFirstTest.Tb_alltype.Save">
<summary>
保存或添加,如果主键有值则尝试 Update如果影响的行为 0 则尝试 Insert
</summary>
</member>
<member name="T:FreeSql.Tests.SqlServer.SqlServerCodeFirstTest.tbdot01">
<summary>
表中带点

View File

@ -9,8 +9,6 @@ public class g
{
static Lazy<IFreeSql> clickHouseLazy = new Lazy<IFreeSql>(() => new FreeSql.FreeSqlBuilder()
.UseConnectionString(FreeSql.DataType.ClickHouse, "Compress=False;BufferSize=32768;SocketTimeout=10000;CheckCompressedHash=False;Encrypt=False;Compressor=lz4;Host=192.168.0.121;Port=8125;Database=PersonnelLocation;Username=root;Password=+riQ8V9D")
//.UseConnectionFactory(FreeSql.DataType.MySql, () => new MySql.Data.MySqlClient.MySqlConnection("Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;"))
//.UseConnectionString(FreeSql.DataType.MySql, "Data Source=192.168.164.10;Port=33061;User ID=root;Password=root;Initial Catalog=cccddd_mysqlconnector;Charset=utf8;SslMode=none;Max pool size=10")
//.UseAutoSyncStructure(true)
//.UseGenerateCommandParameterWithLambda(true)
.UseMonitorCommand(

View File

@ -19,6 +19,11 @@ namespace FreeSql.ClickHouse
public override DbParameter AppendParamter(List<DbParameter> _params, string parameterName, ColumnInfo col, Type type, object value)
{
if (value is string str)
value = str?.Replace("\t", "\\t")
.Replace("\r\n", "\\r\\n")
.Replace("\n", "\\n")
.Replace("\r", "\\r");
if (string.IsNullOrEmpty(parameterName)) parameterName = $"p_{_params?.Count}";
var dbtype = (DbType?)_orm.CodeFirst.GetDbInfo(type)?.type;
DbParameter ret = new ClickHouseDbParameter { ParameterName = parameterName };//QuoteParamterName(parameterName)
@ -38,10 +43,8 @@ namespace FreeSql.ClickHouse
break;
}
if (value is bool)
{
ret.Value = (bool)value ? 1 : 0;
}
}
_params?.Add(ret);
return ret;
}
@ -49,6 +52,11 @@ namespace FreeSql.ClickHouse
public override DbParameter[] GetDbParamtersByObject(string sql, object obj) =>
Utils.GetDbParamtersByObject<DbParameter>(sql, obj, "?", (name, type, value) =>
{
if (value is string str)
value = str?.Replace("\t", "\\t")
.Replace("\r\n", "\\r\\n")
.Replace("\n", "\\n")
.Replace("\r", "\\r");
DbParameter ret = new ClickHouseDbParameter { ParameterName = $"?{name}", Value = value };
var tp = _orm.CodeFirst.GetDbInfo(type)?.type;
if (tp != null)