配置
连接配置
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()}]毫秒...");
}
}
}
);
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 语法 详请见文档 |
提示
- 请不要手动在底层库中直接修改表,如果是已经在数据库创建的物理表当使用该表(增,删,查,改)操作将会自动将表信息同步到该表中
- 如果要更改该表的配置请使用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();
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();
2
3
4
5
6
7
8
9
10
11
12
13
以上代码会抛出异常 因为 UTYP
指定的值U4
不存在于表 H_UType
中 错误显示如:字段[UTYP]配置了表检测 值 [U4] 在表[H_UType]不存在
通过以上两种方式配置基本上就可以把数据逻辑性的错误拦截在系统之外保证系统数据的完整性和准确性,这是HiSql与其它ORM最大的区别之一
编号配置
提示
即将更新