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
https://www.donet5.com/Home/Doc
MIT License
5.24k stars 1.33k forks source link

如何在使用 Ado 对 NpgsqlDbType.Jsonb 处理 #1163

Closed idea-zone closed 1 year ago

idea-zone commented 1 year ago

我使用 Ado 进行数据获取时,无法在 SugarParameter 中设置 NpgsqlDbType.Jsonb 的处理,有办法自定义类型转换吗?或者其他什么方式进行处理?感谢


    // paras 包含 一个
      paraList.Add(new NpgsqlParameter(names[40], NpgsqlDbType.Jsonb) { Value = JsonConvert.SerializeObject(model.OtherContent)});

      // 调用
       List<SugarParameter> sqlParas = NpgsqlParameter2SugarParameterList(paras);
       result = _client.Ado.GetDataTable(strSQL, sqlParas);

       // 自定义的一个类型转换
        private List<SugarParameter> NpgsqlParameter2SugarParameterList(NpgsqlParameter[] paras)
        {
            List<SugarParameter> sqlParas = new List<SugarParameter>();
            if (paras != null && paras.Length > 0)
            {
                foreach (var para in paras)
                {
                    if (para.NpgsqlDbType == NpgsqlDbType.Jsonb || para.NpgsqlDbType == NpgsqlDbType.Jsonb)
                    {
                              // todo:  Jsonb 报错问题 Jsonb 
                    }
                    else
                    {
                        sqlParas.Add(new SugarParameter(para.ParameterName, para.Value, para.DbType));
                    }
                }
            }

            return sqlParas;
        }
DotNetNext commented 1 year ago
 var p = new SugarParameter("name",json字符串){  CustomDbType= NpgsqlDbType.Jsonb };
idea-zone commented 1 year ago

感谢大佬,已经成功解决上述问题。附上当前完成的 NpgsqlParameter2SugarParameterList 的完成版本,方便遇到相同问题的人可以快速解决使用 Ado 调用时,从 NpgsqlParameter 转 SugarParameter 的问题(没有完全列完全部的特殊类型,一般也不用了太多):


        /// <summary>
        /// NpgsqlParameter 转 SugarParameter 类型
        /// </summary>
        /// <param name="paras">Npgsql的参数类别</param>
        /// <returns>SugarParameter的参数列表</returns>
        private List<SugarParameter> NpgsqlParameter2SugarParameterList(NpgsqlParameter[] paras)
        {
            List<SugarParameter> sqlParas = new List<SugarParameter>();
            if (paras == null || paras.Length == 0) return sqlParas;

            foreach (var para in paras)
            {
                if (para.NpgsqlDbType.HasFlag(NpgsqlDbType.Array))
                {  // 如果是包含数组
                    sqlParas.Add(new SugarParameter(para.ParameterName, para.Value)
                    {
                        CustomDbType = para.NpgsqlDbType,
                        IsArray = true,
                    });
                }
                else if (para.NpgsqlDbType == NpgsqlDbType.Jsonb     // - [ ] bug320,2023-06-21,NpgsqlParameter 部分特殊类型 转 SugarParameter ,没有完全写完
                         || para.NpgsqlDbType == NpgsqlDbType.Jsonb
                         || para.NpgsqlDbType == NpgsqlDbType.Geography
                         || para.NpgsqlDbType == NpgsqlDbType.Geometry
                         || para.NpgsqlDbType == NpgsqlDbType.Money
                         || para.NpgsqlDbType == NpgsqlDbType.Polygon
                         || para.NpgsqlDbType == NpgsqlDbType.Box
                         || para.NpgsqlDbType == NpgsqlDbType.Hstore
                         || para.NpgsqlDbType == NpgsqlDbType.Inet
                         || para.NpgsqlDbType == NpgsqlDbType.Xml
                         || para.NpgsqlDbType == NpgsqlDbType.TsQuery
                         || para.NpgsqlDbType.HasFlag(NpgsqlDbType.Multirange)
                         || para.NpgsqlDbType.HasFlag(NpgsqlDbType.Range))
                {  // 如果是包含特殊类型
                    sqlParas.Add(new SugarParameter(para.ParameterName, para.Value)
                    {
                        CustomDbType = para.NpgsqlDbType
                    });
                }
                else
                {  // 不是特殊类型
                    sqlParas.Add(new SugarParameter(para.ParameterName, para.Value, para.DbType));
                }
            }

            return sqlParas;
        }