配置

连接配置

HiSql 的连接通过实例化类HiSqlClient 来进行连接。

注意:创建的连接类不建议放在全局静态变更量中,这样有可能并发操作时造成不可预知的数据库事务问题,可以通过依赖注入的方式来进行连接实例化

  HiSqlClient sqlclient = new HiSqlClient(
      new ConnectionConfig()
        {
          
          DbType = DBType.SqlServer,//指定当前连接数据库的类型(必填)
          DbServer = "local-HoneBI",//必填,对当前连接命一个名

          //数据库连接字符串,在开发业务是需要做一个配置的,如果是加密的请在AppEvent中实现OnDbDecryptEvent事件
          ConnectionString = "server=(local);uid=sa;pwd=Hone@123;database=HiSql;",//; 
          //schema 根据不同类型的库填上相对应的schema sqlserver默认是dbo
          Schema = "dbo",//请务必填上该schema
          //连接是否做了加密
          IsEncrypt = true,
          ///自动关闭连接 默认false
          IsAutoClose = false,

          //sq执行超时监控 当超过配置的值 会就触发OnTimeOut 事件(但不会停止sql运行)
          //在际的开发过程中可以通过该功能来监控Sql的超长sql执行情况用来性能调优
          SqlExecTimeOut = 60000,

          //事件
          AppEvents = new AopEvent()
          {
            OnDbDecryptEvent = (connstr) =>
            {
              //解密连接字段
              //Console.WriteLine(quot;数据库连接:{connstr}");

              return connstr;
            },
            OnLogSqlExecuting = (sql, param) =>
            {
              //sql执行前 日志记录 (异步)

              //Console.WriteLine(quot;sql执行前记录{sql} time:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ffff")}");
            },
            OnLogSqlExecuted = (sql, param) =>
            {
              //sql执行后 日志记录 (异步)
              //Console.WriteLine(quot;sql执行后记录{sql} time:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ffff")}");
            },
            OnSqlError = (sqlEx) =>
            {
              //sql执行错误后 日志记录 (异步)
              Console.WriteLine(sqlEx.Message.ToString());
            },
            OnTimeOut = (int timer) =>
            {
              //Console.WriteLine(quot;执行SQL语句超过[{timer.ToString()}]毫秒...");
            }
          }
        }
      );

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54

系统表Hi_TabModel介绍

Hi_TabModel 用于存储物理表或视图的扩展信息属于HiSql系统表,如果删除该表将无法运行,如果意外删除可以通过HiSql初始化安装来恢复该表

字段描述备注
TabName表名物理表或视图名称
TabReName表的别名表的中文名称或定义一个可以看得明白的文字
TabDescript表描述对表的用途用功能做一下备注
TabStoreType表存储方式0表示行式存储(TabStoreType.Row),1表示列式存储(仅用于HANA)(TabStoreType.Column)
TabType表类型0表示业务表(TabType.Business),1表示事务表(TabType.Transcation),2表示业务配置表(TabType.Config),3表示记录表(TabType.Record),4表示视图(TabType.View) ,5表示结构(TabType.Struct)
TabCacheType表的缓存类型0表示不缓存(TabCacheType.None),1表示全量缓存(TabCacheType.ALL),2表示查询缓存(TabCacheType.QUERY)
TabStatus表状态0表示表还在维护创建中,-1表示该表已经废弃,1表示正常使用,-2表示已经过期但可以正常使用,11表示已经归档 仅用于备用查询
IsSys是否系统内置表是否是系统表
IsEdit是否可编辑该表是否可编辑(结合HiSql GUI界面工具)
IsLog是否开启表日志默认不开启
LogTable日志表名输入表名后将会自动创建该表
LogExprireDay日志保留天数默认0

提示

请不要手动在底层库中直接修改表,如果是已经在数据库创建的物理表当使用该表(增,删,查,改)操作将会自动将表信息同步到该表中

系统表Hi_FieldModel介绍

Hi_FieldModel 用于存储表的字段信息及对该字段的一些个性化配置数据,通过配置这个表可以实现表的数据检测,把逻辑错误的数据拦截在数据库之外

字段描述备注
TabName表名物理表或视图名称
FieldName字段名字段名称
FieldDesc字段名描述对字段进行描述
IsIdentity是否自增ID默认按1自增长
IsPrimary是否主键是否是主键
IsBllKey是否是业务Key默认业务Key与主键相同,也可以不相同,根据该值来判断重复数据
FieldType字段类型字段类型
Regex正则校验表达式如果配置了该值向表插入的值必须匹配才能写入否则会报错
DBDefault默认值类型默认值类型 -1表示无默认值,10表示默认为空值 11表示默认指定值,20表示默认当前日期,30表示默认GUID唯一 MD5值
DefaultValue默认值当是日期时值为FUNDATE 当是GUID时是FUNGUID,其它值就是指定值
FieldLen字段长度字段的长度
FieldDec小数点位数小数点位数 默认0
SNO编号名称编号规则ID 实现自动按日期等流水无跳号编号
SNO_NUM子编号编号规则子号 详见SNRO编号
IsSys是否系统字段设置为True时 不允许业务进行删除或编辑
IsNull是否允许NULL该值数据库中设置的是否允许为NULL
IsRequire是否必填默认false 当为True时插入数据中该字段必须填
IsIgnore是否忽略默认false 暂时未启用
IsObsolete是否作废该字段是否已经过期
IsShow是否显示在查询界面是否显示(与前端绑定)
IsSearch是否允许搜索在查询界面是允许作为搜索条件
SrchMode搜索模式10表示单值查询 ,20表示范围查询 ,30表示多值查询
IsRefTab是否引用表是否需要关联表校验 详请见表检测文档
RefTab引用表名关联校验的表
RefField引用的字段关联校验的字段
RefFields引用字段清单关联显示的字段列表
RefFieldDesc引用字段清单描述关联显示的字段列表中文描述
RefWhere引用条件表引用条件HiSql语法 详请见文档

提示

  1. 请不要手动在底层库中直接修改表,如果是已经在数据库创建的物理表当使用该表(增,删,查,改)操作将会自动将表信息同步到该表中
  2. 如果要更改该表的配置请使用HiSql GUI工具或通过HiSql代码更新

表字段配置

通过正则表达式匹配字段值是否符合要求

平常在系统开发的过程中如用户名 对用户名的规则是有命名规则要求的,如果前端没做判断的话是直接可以写入到数据库中HiSql 提供了这种可以校验配置

举例在表HTest01 中的字段UName (用户名) 如果该用户名只允许数字和字母那么我们可以做一下演示


//在系统表Hi_FieldModel 中对表HTest01 的字段加上正则配置 Regex

sqlClient.Update("Hi_FieldModel", new { TabName = "HTest01", FieldName = "UName", Regex = @"^[\w]+[^']quot; }).ExecCommand();


//执行插入数据
sqlClient.Insert("HTest01", new { SID = "0", UTYP = "U4", UName = "test hisql ", Age = 36, Salary = 11, Descript = "hisql" }).ExecCommand();



1
2
3
4
5
6
7
8
9
10
11

以上代码会抛出异常 因为UName赋的值 test hisql 有空格不符合正则表达式^[\w]+[^']$ 错误显示如:列[UName]值[dd hisql] 不符合业务配置 ^[\w]+[^']$ 要求

这样就可以把逻辑性的错误数据拦截在系统之外

通过关联表校验

举例在表HTest01 中的字段UTYP (用户类型) 这个类型值在表H_UType 中 我们做一下演示

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

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

//执行数据插入
sqlClient.Insert("HTest01", new { SID = "0", UTYP = "U4", UName = "hisql", Age = 36, Salary = 11, Descript = "hisql" }).ExecCommand();

1
2
3
4
5
6
7
8
9
10
11
12
13

以上代码会抛出异常 因为 UTYP 指定的值U4 不存在于表 H_UType 中 错误显示如:字段[UTYP]配置了表检测 值 [U4] 在表[H_UType]不存在

通过以上两种方式配置基本上就可以把数据逻辑性的错误拦截在系统之外保证系统数据的完整性和准确性,这是HiSql与其它ORM最大的区别之一

编号配置

提示

即将更新