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. C++ default constructor | Built-in types

    Predict the output of following program? 1 #include <iostream> 2 using namespace std; 3 4 int ...

  2. Classs类

    Classs类如何获得 获得Class对象 方式一: 通过Object类中的getClass()方法 方式二: 通过 类名.class 获取到字节码文件对象( 方式三: 通过Class类中的方法(将类 ...

  3. 【Java 基础】java 创建对象时重写方法

    TransactionLock mockLock = new TransactionLock() { public boolean lock(String id) { return true; } p ...

  4. MyBatis通过注解实现映射中的嵌套语句和嵌套结果

    案例描述:查看订单或购物车订单信息的同时查询出该订单中所有书籍的信息. 一.嵌套语句 @Select("select* from shopcart where shopcartid = #{ ...

  5. Django auth

    auth是django一个自带的用户验证系统,使用它可以减少我们的开发流程. 基本使用 大体流程: 自定义类 from django.contrib.auth.models import Abstra ...

  6. 如何查看Python中所有关键字

    一.保留字即关键字,我们不能把它们用作任何标识符名称.Python的标准库提供了一个keyword模块,可以输出当前版本的所有关键字 import keyword print(keyword.kwli ...

  7. 【dva】dva的基本用法

    services 该文件夹用于存储services,里面的内容为接口调用函数,记得将数据返回.(request是我自己封装函数,也可以用axios原生的函数) const finishTask = { ...

  8. LuoguB2101 计算矩阵边缘元素之和 题解

    Content 给定一个 \(m\times n\) 的矩阵,求矩阵边缘元素之和. 数据范围:\(1\leqslant m,n\leqslant 100\). Solution 对于新手来说,看到这题 ...

  9. CF1443A Kids Seating 题解

    Content 有 \(t\) 组询问,每组询问给定一个数 \(n\),试构造出一个长度为 \(n\) 的数列 \(\{a_i\}_{i=1}^n\),使得: \(\forall i\in[1,n], ...

  10. 使用Redis+自定义注解实现接口防刷

    最近开发了一个功能,需要发送短信验证码鉴权,考虑到短信服务需要收费,因此对此接口做了防刷处理,实现方式主要是Redis+自定义注解(需要导入Redis的相关依赖,完成Redis的相关配置,gs代码,这 ...