DataReader转Dictionary数据类型之妙用

datareader转dictionary有很多用处,可以输出表中部分字段转实体字段,以前需要全部字段输出或者再建一个实体模型才行,这样就可以减少数据库的输出量了,特别是某些接口的格式化输出很方便。

先看底层代码部分

        /// <summary>
        /// DataReader转Dictionary<string, object>数据类型/// </summary>
        /// <param name="dataReader"></param>
        /// <param name="close"></param>
        /// <returns></returns>
        public static List<Dictionary<string, object>> GetListDictionary(IDataReader dataReader, bool close = true)
        {
            List<Dictionary<string, object>> list = new List<Dictionary<string, object>>();
            if (close)
            {
                using (dataReader)
                {
                    while (dataReader.Read())
                    {
                        list.Add(DataFillDictionary(dataReader));
                    }
                }

            }
            else
            {
                while (dataReader.Read())
                {
                    list.Add(DataFillDictionary(dataReader));
                }
            }
            return list;
        }

        /// <summary>
        /// 将DataReader数据转为Dictionary<string, object>对象/// </summary>
        /// <param name="reader"></param>
        /// <returns></returns>
        public static Dictionary<string, object> DataFillDictionary(IDataReader reader)
        {
            Dictionary<string, object> dict = new Dictionary<string, object>();
            for (int i = 0; i < reader.FieldCount; i++)
            {
                try
                {
                    dict.Add(reader.GetName(i), reader.GetValue(i));
                }
                catch
                {
                    dict.Add(reader.GetName(i), null);
                }
            }
            return dict;
        }

调用

        private void GetWebUserList(HttpContext context)
        {
            string jsonResult = string.Empty;
            var modifiedOn = context.Request["modifiedOn"];
            var list = new List<Dictionary<string, object>>();

            using (var dbHelper = DbHelperFactory.GetHelper(BaseSystemInfo.UserCenterDbType, BaseSystemInfo.UserCenterDbConnection))
            {
                try
                {

                    using (var dr = new BaseUserManager(dbHelper).GetWebUserList(modifiedOn))
                    {
                        if (dr != null)
                        {
                            list = DbLogic.GetListDictionary(dr);
                        }
                    }
                    var timeConverter = new IsoDateTimeConverter { DateTimeFormat = BaseSystemInfo.DateTimeFormat };
                    jsonResult = JsonConvert.SerializeObject(list, Formatting.Indented, timeConverter);
                }
                catch (Exception ex)
                {
                    NLogHelper.Warn(ex, "GetWebUserList异常");
                }
                finally
                {
                    dbHelper.Close();
                }
            }
        }

获取数据的方法

        /// <summary>
        /// 向官网同步用户信息
        /// 只传部分字段
        /// </summary>
        /// <returns></returns>
        public IDataReader GetWebUserList(string modifiedOn)
        {
            string commandText = "SELECT A." + BaseUserEntity.FieldId
                                     + " ,A." + BaseUserEntity.FieldUserName
                                     + " ,A." + BaseUserEntity.FieldRealName
                                     + " ,A." + BaseUserEntity.FieldCode
                                     + " ,A." + BaseUserEntity.FieldCompanyId
                                     + " ,A." + BaseUserEntity.FieldCompanyName
                                     + " ,A." + BaseUserEntity.FieldCompanyCode
                                     + " ,B." + BaseUserContactEntity.FieldMobile
                                     + " ,B." + BaseUserContactEntity.FieldModifiedOn
                            + " FROM " + BaseUserEntity.TableName + " A "
                       + " LEFT JOIN " + BaseUserContactEntity.TableName + " B  "
                              + " ON A." + BaseUserEntity.FieldId + " = B." + BaseUserContactEntity.FieldId;

            // 不传时间 一条记录也不要给
            if (!string.IsNullOrWhiteSpace(modifiedOn))
            {
                var dbParameters = new List<KeyValuePair<string, object>>(); //查询条件参数集合
                commandText += " WHERE B." + BaseUserContactEntity.FieldModifiedOn + " > TO_DATE(" + this.DbHelper.GetParameter(BaseUserContactEntity.FieldModifiedOn + ",‘yyyy-MM-dd HH24:mi:ss‘)");
                // songbiao 做一下限制
                commandText += " AND ROWNUM <= 300";
                dbParameters.Add(new KeyValuePair<string, object>(BaseUserContactEntity.FieldModifiedOn, modifiedOn));
                return this.DbHelper.ExecuteReader(commandText, dbHelper.MakeParameters(dbParameters));
            }

            return null;
        }

输出

上面输出的是数据库字段,我们只需改下查询语句(field as modelfield),也可以输出实体属性。

可以有选择输出表中部分字段,这个方法加上好处很多。

时间: 2024-08-25 04:59:44

DataReader转Dictionary数据类型之妙用的相关文章

Darwin Streaming Server 核心代码分析

基本概念 首先,我针对的代码是Darwin Streaming Server 6.0.3未经任何改动的版本. Darwin Streaming Server从设计模式上看,采用了Reactor的并发服务器设计模式,如果对Reactor有一定的了解会有助于对Darwin Streaming Server核心代码的理解. Reactor模式是典型的事件触发模式,当有事件发生时则完成相应的Task,Task的完成是通过调用相应的handle来实现的,对于handle的调用是由有限个数的Thread来完

转:python dict按照value 排序

我们知道Python的内置dictionary数据类型是无序的,通过key来获取对应的value.可是有时我们需要对dictionary中 的item进行排序输出,可能根据key,也可能根据value来排.到底有多少种方法可以实现对dictionary的内容进行排序输出呢?下面摘取了 一些精彩的解决办法. #最简单的方法,这个是按照key值排序: def sortedDictValues1(adict): items = adict.items() items.sort() return [va

C#:数据库通用访问类 SqlHelper

using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Data.SqlTypes; using System.Globalization; using System.IO; using System.Text.RegularExpressions; using System.Xml; using System.Reflection;

.NET程序员细数Oracle与众不同的那些奇葩点

扯淡 距上次接触 Oracle 数据库已经是 N 年前的事了,Oracle 的工作方式以及某些点很特别,那会就感觉,这货就是一个奇葩!最近重拾记忆,一直在折腾 Oracle,因为 Oracle 与众不同,所以,想在这儿记录下 Oracle 不同于其他数据库的一些地方以及使用 Oracle 过程遇上的点点滴滴,同时,也让对 Oracle 陌生的同学有所了解. 导航 安装与创建数据库 Oracle 奇葩点 限定符 区分大小写 字符类型比较大小写 dual 表 不能执行多条sql sys_guid 函

一起来学设计模式-----工厂模式的实践

工厂设计模式是入门模式,也是使用较多的模式,这一篇就总结下我在测试项目时,看到使用的地方以及编写测试桩时基于此模式的实际运用. 实例一:测试的c++项目--简单工厂+宏函数反射的使用 由于公司对业务和代码要求保密,在这是不能贴业务代码更不能直接给业务UML类图,所以在这我做了一个类似案例的举例.常测试的一个系统,是一个c++编写的后台系统.即是一个服务器端,又是一个客户端:系统在接收上层的业务请求后,根据实际请求组包发送请求给其他接口服务器.其他接口服务器里,以服务器为单位,都是提供2个接口,所

python dict 排序

我们知道Python的内置dictionary数据类型是无序的,通过key来获取对应的value.可是有时我们需要对dictionary中 的item进行排序输出,可能根据key,也可能根据value来排.到底有多少种方法可以实现对dictionary的内容进行排序输出呢?下面摘取了 一些精彩的解决办法. python对容器内数据的排序有两种,一种是容器自己的sort函数,一种是内建的sorted函数. sort函数和sorted函数唯一的不同是,sort是在容器内(in-place)排序,so

C#面向对象_7_集合

集合 复习foreach string[] strArr = new string[] { "小白", "小黑", "小黄", "小红", "小强" }; foreach (string s in strArr) Console.WriteLine(s); 集合 在C#中,集合和数组都可以用存储多个数据元素,但是集合比数组更加灵活,比如:集合可以动态的添加和删除其中的元素.但数组要实现这一点就非常的麻烦和死

7-Python3从入门到实战—基础之数据类型(字典-Dictionary)

Python从入门到实战系列--目录 字典的定义 字典是另一种可变容器模型,且可存储任意类型对象:使用键-值(key-value)存储,具有极快的查找速度: 字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中 语法格式:{ key1 : value1, key2 : value2, key3 : value3 ...} users={' 张三 ' : 18 , ' 李四 ' : 19 , ' 王五 ' : 20 , ' 赵六 '

python 数据类型: 数字Nubmer / 字符串String / 列表List / 元组Tuple / 集合Set / 字典Dictionary

#python中标准数据类型 数字Nubmer 字符串String 列表List 元组Tuple 集合Set 字典Dictionary #单个变量赋值countn00 = '10'; #整数countn01 = '100.0' #浮点countn02 = "双权"; #字符串countn03 = '10'; #数字#print("整数 = "+countn00,"浮点 = "+countn01,"字符串 = "+countn0