hisql github源码下载

git clone https://github.com/tansar/HiSql.git

在设计第二范式数据库时经常会把可能重复的数据单独做一种表关联,但是在写入表时为了数据的严谨需要校验一下值在另外一张表中存不存在

如 用一张用户表(HTest01) 该表表结构如下

其中字段UTYP 的值在另外一张表H_UType中做了维护表结构如下

为了演示使用我们向H_UType 中写入三条数据如下所示

//在表中添加用户类型 Modi方法的意思是 如果存在则更新没有则插入
sqlClient.Modi("H_UType", new List<object> {
new { UTYP = "U1", UTypeName = "普通用户" },
new { UTYP = "U2", UTypeName = "中级用户" },
new { UTYP = "U3", UTypeName = "高级用户" }
}).ExecCommand();

正常我们向表HTest01 写入数据时字段UTYP 的值必须要存在于表H_UType中 不然这条数据就是一条不符合逻辑的数据,也可以认为这是条脏数据,在写代码时如果没有做一些校验就有可有把这种数据成功保存到数据库中

HiSql 作者在日常开发过种也经常碰到这种问题,特别是在多业务场景多人团队开发时尤为明显有些开发考虑的全一点就做了校验有些就忽略了,带来系统的Bug的隐患 ,那有没有一种方式可以杜绝这种基本的逻辑错误呢?

Hisql 提供了这个功能,使用过HiSql的用户肯定知道 在初化始了HiSql后会产生四张标准表如下所示

Hi_TabModel

Hi_FieldModel

Hi_Domain

Hi_DataElement

但这里不重点把每张表的作用一一介绍,我们需要实现本篇讲的数据检测只需要修改一下配置表Hi_FieldModel 代码如下

sqlClient.Update("Hi_FieldModel", new { TabName = "HTest01", FieldName = "UTYP", IsRefTab=true,RefTab= "H_UType",RefField="UTYP", RefFields = "UTYP,UTypeName",RefFieldDesc= "类型编码,类型名称",RefWhere="UTYP<>''" }).ExecCommand();

执行以上更新代码就是将表HTest01 的字段UTYP 配置了向该表插入数据时 字段UTYP 的值必须要是在表H_UType 中的字段UTYP 中,那么在向表HTest01 写入数据时HiSql底层将会自动进行校验

可能大家会担心是不是每条数据都会查表校验会不会有性能问题,其实不用担心 HiSql对这些已经做了特殊处理基本上不用担心如果大家感兴趣可以查看一下HiSql的源码

那么我们就试一试向表HTest01插入数据测试一下看

sqlClient.Insert("HTest01", new { SID = "0", UTYP = "U4", UName = "hisql", Age = 36, Salary = 11, Descript = "hisql" }).ExecCommand();

执行以上代码会出现什么情况呢? 是的会抛出异常如下所示

这是HiSql 底层检测完后抛出的异常,以上代码插入的字段UTYPU4 不在刚才配置的表H_UType 中,所以这是一种不符合正常业务逻辑的非法数据

修改一下代码

sqlClient.Insert("HTest01", new { SID = "0", UTYP = "U3", UName = "hisql", Age = 36, Salary = 11, Descript = "hisql" }).ExecCommand();

这样就可以正常执行了可以通过HiSql 校验

hisql 高级功能数据检测将错误数据拦截在系统外 一的更多相关文章

  1. Jexus高级功能设置

    我们对服务器软件Jexus作了简单的介绍,同时我们也对Jexus的整体配置作了详细的讲解,介绍了Jexus的进程守护工具"jws.guard",相信各位读者对于Jexus应该已经有 ...

  2. MVC5 Entity Framework学习之Entity Framework高级功能(转)

    在之前的文章中,你已经学习了如何实现每个层次结构一个表继承.本节中你将学习使用Entity Framework Code First来开发ASP.NET web应用程序时可以利用的高级功能. 在本节中 ...

  3. MVC5 Entity Framework学习之Entity Framework高级功能

    在之前的文章中,你已经学习了怎样实现每一个层次结构一个表继承. 本节中你将学习使用Entity Framework Code First来开发ASP.NET web应用程序时能够利用的高级功能. 在本 ...

  4. 为ASP.NET MVC应用程序使用高级功能

    为ASP.NET MVC应用程序使用高级功能 这是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译, ...

  5. C#高级功能(三)Action、Func,Tuple

    Action和Func泛型委托实际上就是一个.NET Framework预定义的委托,3.5引入的特性.基本涵盖了所有常用的委托,所以一般不用用户重新声明. Action系列泛型委托,是没有返回参数的 ...

  6. C#高级功能(二)LINQ 和Enumerable类

    介绍LINQ之前先介绍一下枚举器 Iterator:枚举器如果你正在创建一个表现和行为都类似于集合的类,允许类的用户使用foreach语句对集合中的成员进行枚举将会是很方便的.我们将以创建一个简单化的 ...

  7. iOS开发——UI篇Swift篇&玩转UItableView(二)高级功能

    UItableView高级功能 class UITableViewControllerAF: UIViewController, UITableViewDataSource, UITableViewD ...

  8. delphi实现ado的高级功能

    ADO是Microsoft存取通用数据源的标准引擎.ADO通过封装OLE DB而能够存取不同类型的数据,让应用程序能很方便地通过统一的接口处理各种数据库.ADO由一组COM对象组成,每一个不同的原生A ...

  9. pandas小记:pandas高级功能

    http://blog.csdn.net/pipisorry/article/details/53486777 pandas高级功能:面板数据.字符串方法.分类.可视化. 面板数据 {pandas数据 ...

随机推荐

  1. Dubbo服务暴露延迟

    Dubbo 2.6.5 版本以后,如果我们的服务启动过程需要warmup事件,就可以使用delay进行服务延迟暴露.只需在服务提供者的<dubbo:service/>标签中添加delay属 ...

  2. 【编程思想】【设计模式】【创建模式creational】Pool

    Python版 https://github.com/faif/python-patterns/blob/master/creational/pool.py #!/usr/bin/env python ...

  3. class.getName()和class.getSimpleName()的区别

    根据API中的定义: Class.getName():以String的形式,返回Class对象的"实体"名称: Class.getSimpleName():获取源代码中给出的&qu ...

  4. 【Java 与数据库】How to Timeout JDBC Queries

    How to Timeout JDBC Queries JDBC queries by default do not have any timeout, which means that a quer ...

  5. Vuejs-网络

    1.axios是什么 是基于promise用于浏览器和node.js的http客户端一个js库,基于Promise这点要好好理解一下. 2.特点 支持浏览器和node.js 支持promise 能拦截 ...

  6. 【C/C++】n皇后问题/全排列/递归/回溯/算法笔记4.3

    按常规,先说一下我自己的理解. 递归中的return常用来作为递归终止的条件,但是对于返回数值的情况,要搞明白它是怎么返回的.递归的方式就是自己调用自己,而在有返回值的函数中,上一层的函数还没执行完就 ...

  7. 【C/C++】习题3-1 得分/算法竞赛入门经典

    [题目]一个由O和X组成的串,O的得分为目前连续出现的O的个数,X的得分为0.要求统计得分. 我一开始以为要输出表达式,结果好像不需要? [代码] #include <stdio.h> # ...

  8. 车载以太网第二弹 | 测试之实锤-物理层PMA测试实践

    前言 本期先从物理层"PMA测试"开始,下图1为"PMA测试"的测试结果汇总图.其中,为了验证以太网通信对线缆的敏感度,特选取两组不同特性线缆进行测试对比,果然 ...

  9. react-hook简单使用

    一.函数式组件创建 function HelloComponent(props, /* context */) { return <div>Hello {props.name}</d ...

  10. 【教程】OBS直播推流教程(Windows & macOS)

    OBS Open Broadcaster Software | OBS (obsproject.com) Windows直播推流教程 Windows下OBS直播推流非常简单,本教程将会介绍,具体步骤如 ...