Postgresql -infinity 时间转换失败的问题
idea-zone opened this issue · comments
报错误: System.InvalidCastException:“Can't read infinity value since Npgsql.DisableDateTimeInfinityConversions is enabled”
- 设置 AppContext.SetSwitch("Npgsql.DisableDateTimeInfinityConversions", false); 也无法解决这个问题
- 在 ConnectionString 字符串添加 Convert Infinity DateTime=true 直接无法链接
请问如何处理 Postgresql 中 timestamp without time zone 值为 -infinity 或者 infinity 的情况?
是否需要设置某些选项,或者可以设置自定义的类型转换的委托?
这个默认是开启的,你是想关掉他吗
AppContext.SetSwitch("Npgsql.DisableDateTimeInfinityConversions", false); 目前是true sqlsugar中
AppContext.SetSwitch("Npgsql.DisableDateTimeInfinityConversions", false);
放到哪里,我不管是在 Program.Main 中设置,还是在 Startup 类里面设置,都会报错。
这个我处理一下,目前我这边强制了true,你这种需求头一次。
主要有一堆老接口,直接通过下面的方式获取数据,不过不知道为啥,对于 Infinity 能正常处理。
/// <summary>
/// 执行多条查询语句,返回DataSet对象
/// </summary>
/// <param name="strSQL">sql语句,以分号隔开</param>
/// <param name="paras">参数数组</param>
/// <param name="cmdType">Command类型</param>
/// <returns>DataSet对象</returns>
public DataSet GetDataSet(string strSQL, NpgsqlParameter[] paras, CommandType cmdType)
{
DataSet result = new DataSet();
using (NpgsqlConnection conn = new NpgsqlConnection(this.strConn))
{
NpgsqlDataAdapter mySqlAda = new NpgsqlDataAdapter(strSQL, conn);
mySqlAda.SelectCommand.CommandTimeout = 0;
mySqlAda.SelectCommand.CommandType = cmdType;
if (paras != null)
{
mySqlAda.SelectCommand.Parameters.AddRange(paras);
}
mySqlAda.Fill(result);
}
return result;
}
我尝试利用 SqlSugar 改造这个项目,不过一开始没办法把所有业务代码都重写,所以打算用 _client.Ado 把整个帮助类重写,就遇到我一开始提到的问题了:
/// <summary>
/// 执行多条查询语句,返回DataSet对象
/// </summary>
/// <param name="strSQL">sql语句,以分号隔开</param>
/// <param name="paras">参数数组</param>
/// <param name="cmdType">Command类型</param>
/// <returns>DataSet对象</returns>
public DataSet GetDataSet(string strSQL, NpgsqlParameter[] paras, CommandType cmdType)
{
DataSet dt = new DataSet();
List<SugarParameter> sqlParas = NpgsqlParameter2SugarParameterList(paras); // 这个是写的一个简单扩展,把 NpgsqlParameter 数组转化为 SugarParameter 的 List
if (cmdType == CommandType.Text)
{
dt = _client.Ado.GetDataSetAll(strSQL, sqlParas); // _client 就是 SqlSugar.SqlSugarClient 类型
}
else if (cmdType == CommandType.StoredProcedure)
{
dt = _client.Context.Ado.UseStoredProcedure().GetDataSetAll(strSQL, sqlParas);
}
else
{
throw new NotImplementedException($"GetDataSet 没有实现 CommandType 为 {cmdType} 的逻辑");
}
return dt;
}
StaticConfig.AppContext_ConvertInfinityDateTime = true;
在程序启动时加上。
然后将代码更新到最新预览版本
SqlSugarCore 5.1.4.85-preview11
StaticConfig.AppContext_ConvertInfinityDateTime = true; 在程序启动时加上。 然后将代码更新到最新预览版本 SqlSugarCore 5.1.4.85-preview11
感谢
再次感谢,已经解决了遇到的问题.