DotNetNext / SqlSugar

.Net aot ORM Fastest ORM Simple Easy VB.NET Sqlite orm Oracle ORM Mysql Orm 虚谷数据库 postgresql ORm SqlServer oRm 达梦 ORM 人大金仓 ORM 神通ORM C# ORM , C# ORM .NET ORM NET5 ORM .NET6 ORM ClickHouse orm QuestDb ,TDengine ORM,OceanBase orm,GaussDB orm ,Tidb orm Object/Relational Mapping

Home Page:https://www.donet5.com/Home/Doc

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Postgresql -infinity 时间转换失败的问题

idea-zone opened this issue · comments

报错误: System.InvalidCastException:“Can't read infinity value since Npgsql.DisableDateTimeInfinityConversions is enabled”

  1. 设置 AppContext.SetSwitch("Npgsql.DisableDateTimeInfinityConversions", false); 也无法解决这个问题
  2. 在 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

感谢

再次感谢,已经解决了遇到的问题.