当前位置: 首页 > news >正文

mysql的 深度使用 - 游标 , 定时器, 触发器 的使用 ?

游标 叶叫做 光标;

  1. 只能使用在 mysql的 存储过程 或函数中!

  2. 游标的概念? 为什么要使用 游标?


什么叫 定时器, 就是事件 event! 是在 mysql 5.0以上的版本中, 才能使用支持!

所谓的定时器, 就是 事件, 就是 设置好, 每隔多长事件 就执行一次, 设定的事件.
定时器 要执行的事件 是 一个 存储过程.
定时器的 开启/关闭/查看:


开启事件开关?

  1. 定时器开关变量 是一个 全局变量global变量, 不是一个 session变量, 所以 设置时, 要用 set global来设置
MariaDB [test]> set session event_scheduler=On;
ERROR 1229 (HY000): Variable 'event_scheduler' is a GLOBAL variable and should be set with SET GLOBAL
MariaDB [test]> 
  1. interval: inter- value , 表示的是 间隔值, 时间间隔值.

事件/时间任务,和 触发器的区别? 参考: http://www.ibloger.net/article/599.html

实际上, 都是 一样的, 都是 触发器, 只是 触发的理由, 触发原因不同:
event 触发是因为 时间到了, 设定的 定时器 scheduler 到了, 所以 要执行.
而 trigger是因为 设定的 " 特定事件" 发生了, 所以要 执行, 比如" 当设置 插入某个表的一条记录时" 触发执行某个动作!

  1. mysql中 可以设置 像 windows的 定时任务一样的 , scheduler定时器/事件任务 :

create event的 语法?

MariaDB [test]> help create event;
Name: 'CREATE EVENT'
Description:
Syntax:
CREATE
    [DEFINER = { user | CURRENT_USER }]
    EVENT
    [IF NOT EXISTS]
    event_name
    ON SCHEDULE schedule     -- event name 后面 只有三种子句, 一种是: 设置定时器on schedule,  另一种是 规定 on completion 的操作; 第三种是设置 要调用的 存储过程: do call ..
    [ON COMPLETION [NOT] PRESERVE]
    [ENABLE | DISABLE | DISABLE ON SLAVE]
    [COMMENT 'comment']
    DO event_body;

schedule:
    AT timestamp [+ INTERVAL interval] ...         -- 定时器的写法: 要么用at timestamp  要么用 every... 
  | EVERY interval
    [STARTS timestamp [+ INTERVAL interval] ...]                -- starts 和 ends 后面 必须 用timestamp,常见的是 current_timestamp  , 后面的时间间隔 如果要使用 时间间隔, 就必须用 + interval 关键字!  否则直接写间隔值 会报错!

    [ENDS timestamp [+ INTERVAL interval] ...]

创建事件的例子:

MariaDB [test]> create event test_event 

(((( on schedule  every 1 day      
starts current_timestamp + interval  1 day 
ends current_timestamp + interval 30 day
这部分是schedule)))

on completion preserve disable

do call foo();

触发器和 事件: 参考: http://mamicode.com/info-detail-1841394.html http://www.ibloger.net/article/599.html

事件在特定时间发生的 schedule叫做, 应用: at...

注意两个单词的区别?

一个是contact: 联系, contact with sb. 和...联系
一个是: concat: 它对应的单词是: con'catenate con'catenate : 把...一系列事件联系起来...
即: 连接: concat: con -cat: cat 可以认为是猫 的单词,

为什么不允许定义/创建函数?

提示报错: your function has none of DETERMINISTIC, NO SQL OR READS SQL DATA. you might want to use the less safe log_bin_trust_fucntion_creators variable.

  • 原因是: 开启了 bin_log安全设置.
  • 可以查看: show variables like '%func%'; 结果显示, 这个变量为Off.
  • 设置方法是: 开启这个变量为On 或者为 1: set global log_bin_trust_function_creators=1 必须是 全局变量 而不是 session变量!
  • mysql语句 set variable_name=... 默认的是设置 会话 变量, 而上面的 bin_log-...是一个全局变量, 所以 必须显示的用 global 来设置!
  • 注意 必须开启 上面的这个变量, 才允许你创建函数, 否则不行, 即使你 在create后面 声明了 definer='root'@'localhost'都还是不行的!

  1. 在win系统中, 安装wamp后, 在图标上启动mysql , 实际上, 就是执行 mysql安装目录bin下的命令mysql: bin/mysql.exe
  2. 重要的 mysql命令, 就是 mysqladmin, mysql, mysqldump等几个命令, 其他都不是很实用.
  3. 创建数据库的时候, 通常只是对 字符类型的字段才声明 charset 和collate. 对char(), varchar()等类型, 通用的声明方法是: Host char(60) default '' not NULL collate utf_bin, .... 注意的是 默认值'' 跟 NULL是不一样的 , 而且'' 并不是 null. 要注意, 对字符字段默认的比较规则是不区分大小写的, 除非声明 按 binary方式进行比较, 或声明为 collate utf_bin.
使用命令: show collation;
 utf8_general_ci       | utf8     |  33 | Yes     | Yes      |       1 |
 utf8_bin              | utf8     |  83 |         | Yes      |       1 |

mysql> select 'a'='A';
+---------+
| 'a'='A' |
+---------+
|       1 |
+---------+
1 row in set (0.02 sec)

mysql> select binary 'a'='A';
+----------------+
| binary 'a'='A' |
+----------------+
|              0 |
+----------------+
1 row in set (0.03 sec)

mysql>

很重要的一点: 在创建 存储过程和函数的格式中, 记住他们的位置:

  1. create [placeholder1 ] function_sign [placeholder2] routine_body 所谓的 "关键字' 部分, 有3个, 一个是: create, 一个是 函数的签名, 一个是 函数体.
  2. 其中的 placeholder1, 的内容是 定义 创建者是谁: definer='root'@'localhost'
  3. 而 placeholder2 的内容是 声明过程或函数的 特质/特征: characteristic(s): 包括: comment="...." language sql security definer| invoker等等.

硬盘中出现 s.m.a.r.t. 故障提示, 要按F2才能 继续, 怎么办?

smart: 是指硬盘的 self-monitoring analysis and reporting technology: 是指硬盘的 自我监测 分析和报告技术
当硬盘出现 smart 报警时, 表示 硬盘即将要 损坏了...
这时, 可以在 bios中, 将smart 硬盘检测和自我分析报告 关闭, 但是, 要注意 这时的硬盘可能要坏了...注意保存数据

通常, 默认的 smart检测功能, 都是默认关闭的.


存储过程和函数的区别?

  1. 函数返回的是一个表 对象, 所以可以放在 select的后面, 而存储过程 可以 单独 实现.
  2. myisam 的读音 my'izeim, innodb的读音 in-no-db
  3. mysql的引擎默认支持的是innodb....整个支持的引擎包括: myisam, innodb, csv, achieve, 好像在4.1之前的默认引擎是myisam, 但是在5.0以后, 默认引擎就是innodb了。
  4. myisam不支持事务, 对数据的完整性要求不是很高。但是查询性能很好, 如果你的数据库应用主要是查询操作的话, 应该使用myisam引擎。 而innodb支持事务。。。如果你的应用中, 对数据库的增删改操作比较多的的话, 建议使用innodb。
  5. myisam使用三个文件: .frm, .myd, .myi myd是数据文件mydata, myi是mysql index 索引文件. 而innodb 在 innodb_file_per_table =On的时候, 每个表 独占表空间, 一个表占一个文件, 而 innodb_file_per_table=Off 的时候, 是多个表共用 表空间.

  1. 引擎 myisam: 发音: my-zeim. innodb: in-no-db

  2. 引擎myisam和innodb的区别
  • myisam不支持事务,所以不支持行锁,对数据在更改update,insert,delete等操作时的准确性不能保证100%. 但是他的查询效率特别高,所以如果你的项目对数据的一致性要求不是太高的话,或经常进行的是大量的查询工作的话, 应该使用myisam引擎, 因为默认使用的是innodb, 所以应该显式的声明 engine=myisam
  • innodb支持事务,所以对数据的多个表之间的一致性和约束等比较好,但正因为如此,查询效率会受到影响. 如果你的表要经常地增删改,那么应该使用innodb引擎 自动开启 autocommit参数为on set global autocomment=1, show variables like 'autocommit' 会把每一条mysql语句封装成事务, 自动提交. 所以,为了提高性能, 如果有多条语句, 应该将多条语句放在begin和end之间, 而封装成一个事务来处理.
  • 使用 show engines 查看mysql支持哪些引擎, 包括: myisam, memory, innodb, xtradb,mariadb, csv, achieve等引擎, 默认的引擎是 innodb! 有default标识的, 就是默认的存储引擎。
  1. 创建用户, 授予权限是: grant privs on db.tablename to user@... 而取消,收回权限使用的是 revoke. invoke是调用什么函数的.. 而revoke是: 撤销,收回, 否定, 使...无效.
  2. 在mysql中, 字符串中间和末尾的空格 是要作为一个有效的字符来算的, 所以 password字段和 password列是不同的!

  3. show users;?不行? 是的, 在mysql中, 不能要查看有哪些用户, 不能使用show users, 而要查询mysql数据库的user表: select user, Host from mysql.user ;

基本上users的权限表是制定一个帐号在整个MySQL的权限
而Db的权限表是一个users在某个database的权限
举个例子...我们常这样做
让一个帐号在users下完全没权限
但是在Db下让他在某个资料库有完全的权限
这样可以让每一个资料库的使用帐号完全区分开来
避免一个帐号的权限过大可以减少错误的损害范围
也比较能实现到多人操作的环境

注意的是, mysql select语句中的distinct 是修饰的整个后面的选择字段, 而不是仅仅指跟他相挨着的那个字段. 比如

mysql> select distinct user , '@', `Host` from mysql.user;    ###  这里要求的就是, 要 user, 和host 两个都完全 相同的 记录才会被认为是相同的, 而被排除. 而不仅仅是指user.
+------+---+-----------+
| user | @ | Host      |
+------+---+-----------+
| root | @ | 127.0.0.1 |
| root | @ | ::1       |
|      | @ | localhost |
| root | @ | localhost |
+------+---+-----------+
4 rows in set (0.00 sec)

mysql> select distinct user from mysql.user;  
+------+ 
| user |
+------+
| root |
|      |
+------+
2 rows in set (0.02 sec)

mysql>
  1. 如何切换登录用户???
    -- 不能直接在 登录后的mysql环境下切换用户, 要退出mysql到命令行, 然后再用另外的用户进行登录, 仍然使用命令 ` mysql -u 'you_want_to_switch_user' -p '

  2. 授予权限的时候, 要写到具体的表, 而不能只是写数据库,否则他会把on后面的内容 首先当作表来处理. 当然,如果你已经切换到数据库test, 那么可以直接写(只是写表的名称 foo)就可以了.

mysql> grant select on test.foo to zs@localhost;
Query OK, 0 rows affected (0.00 sec)

mysql> grant select on test to zs@localhost;
ERROR 1046 (3D000): No database selected
mysql>

mysql> use test;
Database changed
mysql> grant select on foo to zs@localhost;
Query OK, 0 rows affected (0.00 sec)

mysql>

1.. 为什么只是授予了 select权限, 但是也可以delete? update? insert呢?

如何查看, mysql中的用户拥有哪些权限?

  1. 使用 `show grants for '你的用户名@主机'; 默认的show grants 就是显示的 当前登录用户的权限.
  2. 而如果你要查看 某个 "非当前用户"的权限, 则使用 show grants for other_user;
  3. 而show grants 实际上, 是显示 你使用 (或系统默认使用的) 的 grants 语句命令 创建的语句. 比如
MariaDB [test]> show grants for foo@localhost;
+-----------------------------------------+
| Grants for foo@localhost                |
+-----------------------------------------+
| GRANT USAGE ON *.* TO 'foo'@'localhost' |
+-----------------------------------------+
1 row in set (0.00 sec)

MariaDB [test]> 
  1. 要注意的是, 默认的权限虽然是 usage, 但是 其实它对 其他数据库可能有很多权限, 比如这里的foo虽然是 usage 权限, 但是 它还可以对?????????
MariaDB [(none)]> show grants for foo@localhost;
+-----------------------------------------+
| Grants for foo@localhost                |
+-----------------------------------------+
| GRANT USAGE ON *.* TO 'foo'@'localhost' |
+-----------------------------------------+
1 row in set (0.00 sec)

MariaDB [(none)]> revoke select, delete on test.user from 'foo@localhost';
ERROR 1141 (42000): There is no such grant defined for user 'foo@localhost' on host '%'
MariaDB [(none)]> revoke select, delete on test.user from 'foo'@'localhost';
ERROR 1147 (42000): There is no such grant defined for user 'foo' on host 'localhost' on table 'user'
MariaDB [(none)]> revoke select, delete on `test`.`user` from 'foo'@'localhost';
ERROR 1147 (42000): There is no such grant defined for user 'foo' on host 'localhost' on table 'user'
MariaDB [(none)]> 
  1. 字段的名称的首字母需要大写吗?
    只是 在系统数据库mysql中的表 中, 才使用 大写的字段名称. Host, Db, User, Select_priv
    但是, 通用的表中的字段 还是 使用小写字母开头的字段名.

由于mysql的 "语法错误" 的报告, 没有更详细的错误信息, 也不指出 是哪里的语法 单词 错误, 所以, 如果是发现 报 "语法错误", 那么 首先就是 要去检查 当前命令的 单词 拼写是否正确? 然后看 是否使用了 保留的关键字?

查表 寻找 mysql的权限类型: (主要的权限): http://www.cnblogs.com/cnteam/articles/4272460.html 要注意 每一种权限, 操作的对象是什么 , 比如: create 是创建权限, 那么你要清楚它是创建什么? 等等...

<privileges>是一个用逗号分隔的你想要赋予的MySQL用户权限的列表。你可以指定的权限可以分为三种类型:

数据库/数据表/数据列权限:

Alter: 修改已存在的数据表(例如增加/删除列)和索引。
Create: 建立新的数据库或数据表。
Delete: 删除表的记录。
Drop: 删除数据表或数据库。
INDEX: 建立或删除索引。
Insert: 增加表的记录。
Select: 显示/搜索表的记录。
Update: 修改表中已存在的记录。

全局管理MySQL用户权限:

file: 在MySQL服务器上读写文件。
PROCESS: 显示或杀死属于其它用户的服务线程。
RELOAD: 重载访问控制表,刷新日志等。
SHUTDOWN: 关闭MySQL服务。

特别的权限:

ALL: 允许做任何事(和root一样)。
USAGE: 只允许登录--其它什么也不允许做。

杂项

exe文件, 有时候也可以用 winrar, 7z等进行解压,得到的解压文件, 中可能包含exe可执行文件, 而且这个文件是可以直接执行的, 不需要进行安装。

联想同传和保护

  1. 这种网络同传的功能,有的是通过硬件如hp通过增霸卡来实现的, 有的是通过软件如lenovo来实现的
  2. 联想是通过 “后期”(原来出厂时是没有的) 安装 同传功能的软件 来实现的。 当然在安装 联想同传这个软件的
    时候,本身是不能批量控制的, 因为此时还没有网络管理功能。
    1.联想同传硬盘保护系统, 本身是在bios启动阶段,而不是在win启动后的, 所以它没有其他软件、系统开销的负担, 因此效率应该是更高。
  3. 同时,正是因为这个原因, 这个保护系统使用的函数和类,数据结构等, 也就不是操作系统所提供的api或 c/c++类等了. 他是一个独立的, 小型的, 类似于linux的嵌入式的微型操作系统,比如dos类型的小型结构..
  4. 在操作上, 可以有两种分发: 一是保护和还原的设置(设置保护和取消保护), 另一种是网络参数/网络操作系统的同传等.这两个操作可以看成是两个独立的部分:
  5. 首先是取消发送端(母机) 的保护: 首先在一台计算机上设置 发送端(任何一台机器上都可以), 然后设置好这台发送端. 包括: 隐藏启动菜单, 取消"开发模式重启后自动调整为保护模式" , 主要是 这两个选项. 然后确定. 在进入单机的设置时, 按的是 home键. 注意home键 要 不停的 点按, 不是按着不动
  6. 设置好母机后(整个网络中, 只有一台发送端, 其他自动成为接收端), 然后就是进行同传了, 同传可以有很多种情况: 比如同传cmos参数, 同传保护参数, 同传操作系统等.

  7. 同传的时候, 是点按 F4, 进入联想同传界面.

=======================

很重要的一点是, 当设置好了母机的时候, 单击"确定", 这个时候, 机器还是处于保护模式的! 因此 在 进入同传界面的时候,中间还有一个 操作系统启动的界面 (这个也是为什么要取消 隐藏启动菜单 的原因, 否则这个界面就不会显示出来, 你也不知道什么时候按 ctrl+o ) (在这个界面的底部, 有一些 功能键的 快捷方式提示, 比如ctrl+o进入开放模式等等 ). 就是在这里, 在这个时候, 要按ctrl+o进入 开放模式! 然后接下来, 点按 F4 进入网络同传!

  1. 唤醒: 是指针对 没有 开机的计算机, 如果计算机 已经 开机了, 那么就不存在唤醒了

最重要的一个操作是: 在进行机房维护的时候, 不仅是要使用 联想同传, 还原精灵等软件, 还要结合 电子教室等软件进行操作, 电子教室 在 进行某些操作: "如: 远程关机, 重启学生机, 远程发送文件, 远程执行命令"等方面都是非常有用的.

使用联想同传-硬盘保护系统的时候, 要注意 某些机器的ip地址, 可能会存在: 显示的ip地址,跟实际的ip地址不符的情况, 比如你查看ip地址的时候, 可能是 172.16.5.123 但是你进入网卡设置的时候, 却是 172.16.5.1 这个原因可能是跟 联想同传在自动分配/发送ip地址的时候, ip地址修改失败 造成的.

这个 ip地址设置错误或 冲突 , 也是 很多时候, 同传机器连接不到 服务器/发送端的 原因所在. 发现连接不上发送端的情况, 最好还是查看一下, 改一下ip地址, 这样工作量 更小一些, 不然后期再一台一台的去手动进行保存的话, 还是比较麻烦的. 可以将这些连不上的机器的ip地址改大一些如234, 240等


#### 为什么win启动时总是每次提醒 check d:?
原因, 可能是因为非正常关机, 或恶意程序损坏了系统文件.
解决方案:

  1. 在d: 驱动器上右键, 弹出属性->工具-> 检查-> 开始检查中 勾选修复...修复完成后, 就可能会消失, 不再提醒检查
  2. 使用cmd命令 : chkdsk 或 chkntfs命令:
    chkdsk命令 直接检查扫描 硬盘分区.
    或者使用 chkntfs:
    chkntfs有几个开关:
    /d 使用default 默认设置, 让win(xp或 win7+)等在每次开机时, 自动检查(所有)分区的完整性
    , 如果有错误, 则自动执行 chkdsk命令
    /x: exclude 排除, chkntfs /x d: e: 表示 启动时排除检查(不检查) d盘和e盘
    /c: 则是跟/x相反, 指定检查启动时, 要检查某个分区

  3. 在windows中, 命令的 选项被成为开关switcher / 参数等, 而在linux中始终被成为options

在综合布线中, 水晶头的个数的 经验公式?

  1. 这是经验公式, 其中的冗余量, 富余量为15%左右, 具体富余多少, 由实际情况决定
  2. 在公式 a=b*4*(1+15%) 在的4, 要根据具体情况来定, 也可能是2, 要看你的布线中, 是否使用了 配线架/理线环/信息插座, 如果没有配线架和信息插座, 则网线是直接从 交换机 拉到 工作区的工作电脑上, 那么 一个信息点 < = > 就 对应着一根跳线, 此时倍数就是2. 乘以4倍: 是根据 规范的/完整的布线规矩: 使用配线架/理线环/信息插座时, 在信息插座到工作区电脑有一根跳线, 在机柜/管理间内, 从交换机到配线架 之间还有一个跳线, 所以对于一个信息点就是 2根 跳线, 所以 水晶头的数目是 4倍 +

冗余:
或直接是: a=4b(1+15%)=4*1.15b=4.6 b 就好了!!

而网线的估算是: L = (0.55(最远距离+最近距离)+6) 信息点的个数.
网线箱数: L/305, 其中305米表示, 每一箱的长度


win advanced installer是通过捕获安装过程中的对话框/选项/按钮来生成 安装时需要的配置文件, 从而在msi安装时可以实现自动 读取安装配置文件而静默安装.

要先运行 "repackager" 重新包装器, 然后将捕获的结果导入到 advanced installer中生成新的工程, 然后将 新生成的 工程进行 "重新构建" 即可以得到 msi结果文件.

i accept the terms in the license agreement.

Advanced installer: 高级安装器
是将exe等安装文件, 转换成msi文件, 添加/自动生成 “安装配置文件脚本”, 进行静默安装, 静默安装时, 会自动读取安装配置脚本中的设置。

AI进行Repackage时, 会去 “捕获”抓取, 实际安装exe程序时, 中间的一些选择/输入 对话框界面, 以及这些对话框界面上的 按钮。


ximalaya 下载文件的位置, 并不一定就是 "ting/download", 你要看他的 设置中 指定的 下载文件的位置, 比如: 有些设置 是: /storage/'emulated/0/Andriod/data/com.ximalaya.ting.andriod/files/download/ 中.

  1. emulate: 两个意思, 一是"模仿, 效仿", 另一个 是" 模拟, 仿真"...
  2. 下载的文件, 本身就是音频文件, 只是它不是以 mp3结尾的扩展名, 但是即使不用改名, 也可以用音频软件 直接进行播放.

开发web应用程序, 跟桌面应用程序一样,主要的内容和编码还是 实现业务, 功能, 跟桌面应用程序
的开发过程,思想,方法好步骤等应该是一样的, 而不是简单的实现界面。
界面应该是以 功能/业务 为目标为参考依据来实现和设计的。
比如 zhixue网

相关文章:

  • spark(2.1.0) 操作hbase(1.0.2)
  • RabbitMQ(一):Window安装RabbitMQ
  • CCF 201503-4 网络延时
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • unit 7文档练习
  • 进入Linux救援(rescue)模式的四大法门
  • Android开发12——Andorid中操作数据库的insert的两种方法以及nullColumnHack
  • 黑客系列-以彼之道还施彼身
  • [web前端] yarn和npm命令使用
  • 在windows上搭建镜像yum站的方法(附bat脚本)
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • Price Tag | INTERVIEW 03 | 独立开发者 Tolecen
  • GitHub上优秀的Go开源项目
  • 51CTO试一下
  • 《从零开始学Swift》学习笔记(Day 10)——运算符是“ +、-、*、/ ”吗?
  • 【React系列】如何构建React应用程序
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • 03Go 类型总结
  • Java精华积累:初学者都应该搞懂的问题
  • Laravel Telescope:优雅的应用调试工具
  • Odoo domain写法及运用
  • SAP云平台里Global Account和Sub Account的关系
  • SQL 难点解决:记录的引用
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • 简单基于spring的redis配置(单机和集群模式)
  • 区块链分支循环
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 使用Swoole加速Laravel(正式环境中)
  • 提醒我喝水chrome插件开发指南
  • 网络应用优化——时延与带宽
  • postgresql行列转换函数
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • 通过调用文摘列表API获取文摘
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • ​油烟净化器电源安全,保障健康餐饮生活
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • #pragma once与条件编译
  • #stm32驱动外设模块总结w5500模块
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • $jQuery 重写Alert样式方法
  • (007)XHTML文档之标题——h1~h6
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (附源码)ssm高校实验室 毕业设计 800008
  • (十六)Flask之蓝图
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (四)汇编语言——简单程序
  • (算法二)滑动窗口
  • (一一四)第九章编程练习
  • (转)nsfocus-绿盟科技笔试题目
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .net core使用ef 6
  • .NET 分布式技术比较
  • .net知识和学习方法系列(二十一)CLR-枚举