利用dynamic简化数据库的访问
今天写了一个数据库的帮助类,代码如下。
public static class DbEx
{
public static dynamic ReadToObject(this IDataReader reader)
{
var obj = new DbObject(); for (int i = ; i < reader.FieldCount; i++)
{
obj[reader.GetName(i)] = new DbField()
{
DbData = reader[i]
};
} return obj;
} public class DbObject : DynamicObject
{
//自己实现一个,不用ExpandoObject, 以支持无视大小写读取
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
result = this[binder.Name];
return true;
} Dictionary<string, object> _values = new Dictionary<string, object>(StringComparer.CurrentCultureIgnoreCase); public object this[string index]
{
get => _values[index];
set => _values[index] = value;
}
} public class DbField
{
public object DbData { get; set; } public T Value<T>()
{
return (T)Convert.ChangeType(DbData, typeof(T));
} public static implicit operator string(DbField data) => data.Value<string>();
public static implicit operator int(DbField data) => data.Value<int>();
public static implicit operator DateTime(DbField data) => data.Value<DateTime>();
public static implicit operator double(DbField data) => data.Value<double>();
public static implicit operator bool(DbField data) => data.Value<bool>();
}
}
简单的来讲,可以把如下代码
GpsData parse(IDataReader reader)
{
return
new
GpsData()
{
IsValid = (bool)reader["IsValid"],
Location = new
Location ()
{
Lon = (double)reader["Lon"],
Lat = (double)reader["Lat"],
},
Angle = (double)reader["Angle"],
Speed = (double)reader["Speed"]),
UpdateTime = (double)reader["Speed"]),
};
}
转换为如下形式
GpsData
parse(IDataReader reader)
{
var obj = reader.ReadToObject();
var state = new
GpsData()
{
IsValid = obj.IsValid,
Location = new
Location()
{
Lon = obj.Lon,
Lat = obj.Lat,
},
Angle = obj.Angle,
Speed = obj.Speed,
UpdateTime = obj.UpdateTime,
};
return state;
}
主要还是利用dynamic的特性,转换成这样的好处有:
- 以属性的方式替换下标方式读取,更加间接直观
- 属性的方式读取变量时不分大小写
- 支持自动类型转换,例如,如果数据库里的类型是int型,而目标是string型,会进行自动类型转换
- 自动识别目标类型,不需要显示强制类型转换,更加简洁
利用dynamic简化数据库的访问的更多相关文章
- Python基础(三):简化除法判断、分析apache访问日志、扫描存活主机、利用多线程实现ssh并发访问
一.简化除法判断 目标: 编写mydiv.py脚本,主要要求如下: 提示用户输入一个数字作为除数 如果用户按下Ctrl+C或Ctrl+D则退出程序 如果用户输入非数字字符,提示用户应该输入数字 如果用 ...
- 走向DBA[MSSQL篇] 从SQL语句的角度 提高数据库的访问性能
原文:走向DBA[MSSQL篇] 从SQL语句的角度 提高数据库的访问性能 最近公司来一个非常虎的dba 10几年的经验 这里就称之为蔡老师吧 在征得我们蔡老同意的前提下 我们来分享一下蔡老给我们 ...
- 八:SpringBoot-集成JPA持久层框架,简化数据库操作
SpringBoot-集成JPA持久层框架,简化数据库操作 1.JPA框架简介 1.1 JPA与Hibernate的关系: 2.SpringBoot整合JPA Spring Data JPA概述: S ...
- 【DG】利用闪回数据库(flashback)修复Failover后的DG环境
利用闪回数据库(flashback)修复Failover后的DG环境 1.1 BLOG文档结构图 1.2 前言部分 1.2.1 导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能, ...
- 如何利用反射简化Servlet操作
如何利用反射简化Servlet操作 一.反射的实现 新建类BaseServlet,继承HttpServlet(不需要在web.xml文件中配置) 1.在doPost()方法中处理请求乱码,并调用d ...
- 利用Helm简化Kubernetes应用部署(1)
目录 利用Helm简化Kubernetes应用部署 Helm基础 安装Helm 使用Visual Studio 2019为Helm编写一个简单的应用 利用Helm简化Kubernetes应 ...
- 利用Helm简化Kubernetes应用部署(2)
目录 定义Charts 使用Helm部署Demo Helm常用操作命令 定义Charts 回到之前的“charts”目录,我们依次进行解读并进行简单的修改. Chart.yaml 配置示例: a ...
- Java套接字实现应用程序对数据库的访问
最近在完成软件体系结构上机实验时,遇到一个有点点小难度的选做题,题目信息如下: 利用套接字技术实现应用程序中对数据库的访问.应用程序只是利用套接字连接向服务器发送一个查询的条件,而服务器负责对数据库的 ...
- Git中如何利用生成SSH个人公钥访问git仓库
Git中如何利用生成SSH个人公钥访问git仓库方法(这里以coding平台为例): 1. 获取 SSH 协议地址 在项目的代码页面点击 SSH 切换到 SSH 协议, 获得访问地址, 请使用这个地址 ...
随机推荐
- asp.net C#母版页和内容页事件排版加载顺序生命周期
asp.net C#母版页和内容页事件排版加载顺序生命周期 关于ASP页面Page_Load发生在事件之前而导致的问题已经喜闻乐见,对于问题的解释也很全面,但是如何解决问题则较少有人说明,我就再 简单 ...
- Java使用WebSocket
网页端的消息推送,一般有以下方式: 轮询方式:客户端定时向服务端发送ajax请求,服务器接收到请求后马上返回消息并关闭连接. 优点:后端程序编写比较容易. 缺点:TCP的建立和关闭操作浪费时间和带宽, ...
- MFC里ON_COMMAND_RANGE消息映射的ID问题
今天在工作中遇到一个问题,一个动态菜单,每个菜单的菜单项ID是我自己定义的,定义如下: #define IDM_SEARCHRECORD0 222240 #define IDM_SEARCHRECOR ...
- python的一个小原理
在许多语言当中,类似于a.b()这样的调用方法是一个整体,但在Python中,它其实是两部分:获取属性a.b,调用().所以也可以写成: c = a.b c() 2.关于继承 class a: num ...
- 【干货】使用EnCase来分析windows 7文件系统------认识元数据记录$MFT,数据恢复
来源:Unit 6: Windows File Systems and Registry 6.1 Windows File Systems and Registry Windows NTFS File ...
- string替换所有指定字符串(C++)
C++的string提供了replace方法来实现字符串的替换,但是对于将字符串中某个字符串全部替换这个功能,string并没有实现,我们今天来做的就是这件事. 首先明白一个概念,即string替换所 ...
- MySQL5.7 GTID在线开启与关闭【转】
当前场景 当前某些业务还有未开启GTID服务组,升级5.7后,如何检测是否符合开启GTID条件,如何在线修改切换使用GTID:已经升级5.7后,已经开启GTID,如何快速回滚后退: 线上gtid如 ...
- eclipse导入导出工作空间配置
首先,导出T1中的配置:打开T1,选择fileExport 在弹出框中选择General 下的preferencenext在export preferences 页面选择export all, 点Br ...
- 2012 Dhaka
2012 Dhaka B - Wedding of Sultan 题目描述:给出一棵树的\(dfs\)序(只要经过就会记录),求每个点的度 solution 按\(dfs\)序的规则还原这棵树就好了. ...
- list 转换成dictionary,并统计词频
>>> from collections import Counter>>> Counter(['apple','red','apple','red','red', ...