博客 (759)

一: 执行sql语句,返回受影响的行数

在mysql里面,如果没有影响,那么返回行数为  -1 ,sqlserver 里面  还没有测试过

 (var ctx =  MyDbContext())
{
    ctx.Database.ExecuteSqlCommand("");
}


二 : Database.SqlQuery<T>   EF5执行sql查询语句 Database.SqlQuery 带返回值

这个准确的说是  IEnumerable<T> SqlQuery<T>(string sql, params object[] parameters)  ,注意返回值是 IEnumerable

这个是执行sql语句,返回你想要的类型的列表

dbMain.Database.SqlQuery<int>("select max(UserId) from tb_user_account").First();


或者假如你自己有个类别

  PersonView
{      PersonID { ; ; }      Name { ; ; }
}


那么就可以直接返回这个 PersonView类

 (var ctx =  MyDbContext())
{
    var peopleViews = ctx.SqlQuery<PersonView>("").ToList();
}

直接返回你想要的数据. 例如这里是 List<PersonView> 列表


转自 梨花驿路 6 年前
4,387

“/”应用程序中的服务器错误。

无法为具有固定名称“MySql.Data.MySqlClient”的 ADO.NET 提供程序加载在应用程序配置文件中注册的实体框架提供程序类型“MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.10.7.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d”。请确保使用限定程序集的名称且该程序集对运行的应用程序可用。有关详细信息,请参阅 http://go.microsoft.com/fwlink/?LinkId=260882。

打开 nuget,卸载并重新安装 MySql.Data 和 MySql.Data.Entity

如果没有效果,打开 web.config,检查是否多次定义了 MySql.Data.MySqlClient

xoyozo 6 年前
6,917

“/”应用程序中的服务器错误。

未能加载文件或程序集“MySql.Data.Entity.EF6, Version=6.10.7.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)


6.10.7 版本的 MySql.Data.Entity.EF6.dll 文件发布后会自动变成 6.10.6,文件大小一样,只要用 FTP 上传覆盖一下即可。

xoyozo 6 年前
4,906

“/”应用程序中的服务器错误。


The host xxx does not support SSL connections.

说明: 执行当前 Web 请求期间,出现未经处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 

异常详细信息: MySql.Data.MySqlClient.MySqlException: The host xxx does not support SSL connections.



在 Web.config  的 connectionStrings 节点找到相关数据库连接,在 connectionString 中增加属性值:SslMode=none

xoyozo 6 年前
5,145

如果 .NET Core 项目发布到服务器上报以下错误:

HTTP Error 502.5 - Process Failure

Common causes of this issue:

  • The application process failed to start

  • The application process started but then stopped

  • The application process started but failed to listen on the configured port

Troubleshooting steps:

  • Check the system event log for error messages

  • Enable logging the application process' stdout messages

  • Attach a debugger to the application process and inspect

For more information visit: https://go.microsoft.com/fwlink/?LinkID=808681

在服务器上安装最新的 .NET Core Runtime 即可(Windows Server 选择 Hosting Bundle Installer)。

xoyozo 6 年前
4,202

本文未完成,部分测试方法、条件或结果可能有误,请谨慎参考! :)

本文基于 MySQL 的 InnoDB BTREE 方法的索引进行测试。

以一张包含 2000 万条记录的表做实验:

CREATE TABLE `dt_read`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `time` datetime(0) NOT NULL,
  `a_id` int(11) NOT NULL,
  PRIMARY KEY (`id`) USING BTREE
);

这张表是用于记录文章点击量的,

`id` 为主键,int(11) 自增;

`time` 为非空 datetime,表示文章打开时间,测试数据是从 2017-03-11 至 2018-04-28;

`a_id` 为非空 int(11),表示文章 ID,在此表中不唯一,测试数据是从 1 至 260218。


体验“全表扫描”


首先来体验一下什么是全表扫描,执行下面语句:

SELECT * FROM `dt_read` WHERE `time` < '2020-1-1' LIMIT 10

> 时间: 0.012s


SELECT * FROM `dt_read` WHERE `time` < '2000-1-1' LIMIT 10

> 时间: 7.317s


表中数据是按主键从小到大排列的,当查询条件为 `time` < '2020-1-1' 时,能很快地从表的前端找到 10 条满足条件的数据,所以不再继续判断后面的记录,立刻返回结果,耗时 0.012 秒;但当条件改为 `time` < '2000-1-1' 时,同样逐条判断,直到最后一条也没有找到,这种情况就是所谓的“全表扫描”,耗时 7 秒。


索引对 ORDER BY 的 ASC 和 DESC 的影响


我们给 `time` 建一个索引,同样执行刚才需要全表扫描的语句:

SELECT * FROM `dt_read` WHERE `time` < '2000-1-1' LIMIT 10

> 时间: 0.012s


创建 `time` 的索引后,相当于生成了一张按 `time` 字段排列的新表,这时 MySQL 就能够很快地定位并找到符合条件的记录,避免了全表扫描。


试试按 `time` 倒序排:

SELECT * FROM `dt_read` WHERE `time` < '2000-1-1' ORDER BY `time` DESC LIMIT 10

> 时间: 0.013s


结论:索引对 ORDER BY 的顺序(ASC)和倒序(DESC)都是有效的。


索引字段的次序对 WHERE 和 ORDER BY 的影响


删除所有索引,创建一个新的索引,字段依次为 `time`, `a_id`。

分别执行以下查询:


SELECT * FROM `dt_read` WHERE `time` < '2000-1-1' AND `a_id` < 0 LIMIT 10

> 时间: 0.013s


SELECT * FROM `dt_read` WHERE `a_id` < 0 AND `time` < '2000-1-1' LIMIT 10

> 时间: 0.013s


结论:MySQL 会自动优化 WHERE 条件的次序来匹配最合适的索引。

但在 ORDER BY 中却不是这么回事了:


SELECT * FROM `dt_read` ORDER BY `time`, `a_id` LIMIT 10

> 时间: 0.013s


SELECT * FROM `dt_read` ORDER BY `a_id`, `time` LIMIT 10

> 时间: 14.066s


原因也很好理解,对两个字段进行排序,先后次序肯定会影响结果集,因此只能以 SQL 语句指定的字段次序来 ORDER BY,这样,按索引的字段次序进行 ORDER BY 查询无疑是更快的。


索引中的字段必须依次使用


保持上例创建的索引不变,即 `time`, `a_id`。


SELECT * FROM `dt_read` WHERE `time` < '2000-1-1' AND `a_id` < 0 LIMIT 10

> 时间: 0.013s


SELECT * FROM `dt_read` WHERE `a_id` < 0 LIMIT 10

> 时间: 6.438s


上句合理利用了索引的字段,而下句跳过了 `time`,直接 WHERE 了 `a_id`,这是不受该索引支持的。

我们可以想象一下这张由索引生成的虚拟表,其实就是一张普通的平面二维表格,按索引指定的字段次序进行了排序,所以全表中仅仅是索引指定的第一个字段是按大小排列的,第二个字段是在第一个字段值相同的区域内按大小排列,后同。所以,跳过索引指定的第一个字段直接对第二个字段进行检索,是无法应用该索引的。这个结论也同样也体现在 ORDER BY 语句中:


SELECT * FROM `dt_read` ORDER BY `time`, `a_id` LIMIT 10

> 时间: 0.013s


SELECT * FROM `dt_read` ORDER BY `a_id` LIMIT 10

> 时间: 29.566s


WHERE 和 ORDER BY 混合


保持上例创建的索引不变,即 `time`, `a_id`。


先来执行这两句:


SELECT * FROM `dt_read` ORDER BY `a_id` LIMIT 10

> 时间: 12.29s


SELECT * FROM `dt_read` WHERE `time` < '2000-1-1' ORDER BY `a_id` LIMIT 10

> 时间: 0.013s


仅仅 WHERE 了一个 `time`,对 ORDER BY `a_id` 的效率却有质的提升,是因为 WHERE 中的 `time` 和 ORDER BY 中的 `a_id` 一起找到了索引吗?答案是否定的。

我们把时间改大,让它能马上找到符合条件的数据:


SELECT * FROM `dt_read` WHERE `time` < '2020-1-1' ORDER BY `a_id` LIMIT 10

> 时间: 22.34s


为什么这个语句就不走索引了呢?

其实,一个简单的 SELECT 查询语句,首先执行 WHERE,然后 ORDER BY,最后是 LIMIT。每一步都独自去找了索引,而非 WHERE 和 ORDER BY 混在一起去找索引。必须保证每一步是快的,最终才是快的。

当 `time` < '2000-1-1' 时,WHERE 用到了索引,所以很快,ORDER BY 却没有用到索引,但为什么也很快呢?因为 WHERE 的结果集非常小(示例中为 0 条)。

当 `time` < '2020-1-1' 时,WHERE 也用到了索引,但其结果集非常大(示例中为所有记录),再 ORDER BY `a_id` 就非常慢了,因为我们没有创建以 `a_id` 开头的索引。


现在把索引改成只有 `time` 一个字段。


SELECT * FROM `dt_read` WHERE `time` < '2020-1-1' ORDER BY `a_id` LIMIT 10

> 时间: 6.033s


因为索引里有 `


SELECT * FROM `dt_read` WHERE `time` < '2000-1-1' ORDER BY `a_id` LIMIT 10

> 时间: 0.013s


SELECT * FROM `dt_read` WHERE `a_id` < 0 ORDER BY `time` LIMIT 10

> 时间: 6.033s


第二句先 WHERE `a_id`,后 ORDER BY `time` 是不能匹配所建的索引的。


索引中的字段越多越好


分别在创建索引(`time`)和索引(`time`, `a_id`)的情况下执行下面语句:

本例使用 ORDER BY 而不是 WHERE 来测试是因为,在 WHERE 的多个条件下,如果符合前一条件的筛选结果集过小会导致判断第二条件时数据量不足,无法判断索引是否起作用。


SELECT * FROM `dt_read` ORDER BY `time` LIMIT 10


仅创建索引(`time`)的情况下:

> 时间: 0.013s


仅创建索引(`time`, `a_id`)的情况下:

> 时间: 0.013s


SELECT * FROM `dt_read` ORDER BY `time`, `a_id` LIMIT 10


仅创建索引(`time`)的情况下:

> 时间: 15.015s


仅创建索引(`time`, `a_id`)的情况下:

> 时间: 0.014s


可以看到,在索引字段依次使用的前提下,索引字段数不少于查询字段数才能避免全表扫描。

虽然索引中的字段越多越好,但必须依次使用,否则也是无效索引。


索引对 INSERT / UPDATE / DELETE 的效率影响


分别在创建索引(`time`)和索引(`time`, `a_id`)的情况下执行下面语句:


INSERT INTO `dt_read` (`time`, `a_id`) VALUES ('2018-4-28', 260218)


不建索引的情况下:

> 时间: 0.01s


仅创建索引(`time`)的情况下:

> 时间: 0.01s


同时创建索引(`time`)和索引(`time`, `a_id`)的情况下:

> 时间: 0.01s


UPDATE `dt_read` SET `time` = '2018-4-28' WHERE `id` = 20000000(注:存在该 id 值的记录)


不建索引的情况下:

> 时间: 0.01s


仅创建索引(`time`)的情况下:

> 时间: 0.01s


同时创建索引(`time`)和索引(`time`, `a_id`)的情况下:

> 时间: 0.01s


虽然在 INSERT / UPDATE / DELETE 时数据库会更新索引,但从实测数据来看,索引对其效率的影响可忽略不计。


一些误区


“in 语法效率很低”?

in 语法也是应用索引的,网传 in 会比一个一个 WHERE OR 要慢得多的说法是不靠谱的。in 主键和 in 索引同理。


另外:

对于字符串类型,LIKE '%abc%' 是不能应用索引的,但 LIKE 'abc%' 可以。更多关于字符串类型的索引,请查阅全文索引(FULLTEXT)。

索引的字段是可以指定长度的,类似字符串索引指定前面若干唯一字符就可以优化效率。


本文系个人实践总结,欢迎批评指正!


xoyozo 6 年前
3,149

删除主题时,会变更主题表 pre_forum_thread:

displayorder = -1

moderated = 1

帖子表(或分表) pre_forum_post* 该主题的所有帖子的

invisible = -1

同时 pre_forum_threadmod 会新增一条 DEL 记录,用于显示到 Discuz! 控制面板 - 内容 - 主题回收站。


删除回帖时,会变更回帖表 pre_forum_post(或分表):

invisible = -5


屏蔽回复时,会变更回复表 pre_forum_post(或分表):

status = 1

xoyozo 6 年前
3,640

短信通判断了 30 天内提交错误验证码超过 5 次会有该提示,代码:

TIM图片20180411153446.png

可按实际情况进行修改,涉及文件:

/source/plugin/smstong/smstong.class.php

/source/class/class_member.php

xoyozo 6 年前
2,964

Code 128 条形码可以表示全部 128 个 ASCII 码字符(数字、大小写字母、符号和控制符)。

Code 128 有三个子集:Code 128A、Code 128B 和 Code 128C。

Code 128A 用来编码数字、大写字母、控制符、部分符号;

Code 128B 用来编码数字、大写字母、小写字母、符号;

Code 128C 用来编码 2 位数字 [00,99]。


  • 码条大小有 4 种,按照宽度,我们用 1、2、3、4 来表示。

  • 一个完整的 Code 128 条码是由:起始符、字符串、检验位、终止符组成的。

  • 每个字符由 3 个条、3 个空、11 个单元构成,字符串可变长。

  • 黑色线条用 B(Bar)表示,白色空位用 S(Space)表示,那么一个字符是由 BSBSBS 组成的。

  • 起始符有三种,“CODE-A”、“CODE-B”和“CODE-C”。起始符的类型决定了后面字符的构成。

CODE 128构成

  • 当采用码来设置字符时(CODE-A、CODE-B 和 CODE-C),起始符为 CODE-A 的条码在条码的处理中可以变为采用 CODE-B 或 CODE-C 栏的字符。

  • 当采用“SHIFT”时,只有紧靠 SHIFT 的一个字符可以在下一栏被变更(A 到 B,B 到 C,C 到 A)。(和电脑键盘上的 SHIFT 键操作类似)


校验字符通过 MOD103 算法,下面举例说明:

例 1:xoyozo.net
信息:StartB x o y o z o . n e t
值:104 88 79 89 79 90 79 14 78 69 84
位置:- 1 2 3 4 5 6 7 8 9 10
计算:104 + 88 * 1+ 79 * 2 + 89 * 3 + 79 * 4 +90 * 5 + 79 * 6 + 14 * 7 + 78 * 8 + 69 * 9 + 84 * 10 = 4040
取模:4040 % 103 = 23
完整的条形码信息: (Start B)xoyozo.net(7)(STOP)

例 2:C08244
信息:StartB C 0 CodeC 82 44
值:104 35 16 99 82 44
位置:- 1 2 3 4 5 6
计算:104 + 35 * 1+ 16 * 2 + 99 * 3 + 82 * 4 +44 * 5 = 1016
取模:1016 % 103 = 89
完整的条形码信息: (Start B)C0(CodeC)8244(y)(STOP)


在线示例:https://xoyozo.net/Tools/Code128


附 Code 128 编码表:

ValueCode ACode BCode CPatternASCII Code
BSBSBS
0SPSP00212222SP (ASCII 32)
1!!01222122! (ASCII 33)
2""02222221" (ASCII 34)
3##03121223# (ASCII 35)
4$$04121322$ (ASCII 36)
5%%05131222% (ASCII 37)
6&&06122213& (ASCII 38)
7''07122312' (ASCII 39)
8((08132212( (ASCII 40)
9))09221213) (ASCII 41)
10**10221312* (ASCII 42)
11++11231212+ (ASCII 43)
12,,12112232, (ASCII 44)
13--13122132- (ASCII 45)
14..14122231. (ASCII 46)
15//15113222/ (ASCII 47)
1600161231220 (ASCII 48)
1711171232211(ASCII 49)
1822182232112 (ASCII 50)
1933192211323 (ASCII 51)
2044202212314 (ASCII 52)
2155212132125 (ASCII 53)
2266222231126 (ASCII 54)
2377233121317 (ASCII 55)
2488243112228 (ASCII 56)
2599253211229 (ASCII 57)
26::26321221: (ASCII 58)
27;;27312212; (ASCII 59)
28<<28322112< (ASCII 60)
29==29322211= (ASCII 61)
30>>30212123> (ASCII 62)
31??31212321? (ASCII 63)
32@@32232121@ (ASCII 64)
33AA33111323A (ASCII 65)
34BB34131123B (ASCII 66)
35CC35131321C (ASCII 67)
36DD36112313D (ASCII 68)
37EE37132113E (ASCII 69)
38FF38132311F (ASCII 70)
39GG39211313G (ASCII 71)
40HH40231113H (ASCII 72)
41II41231311I (ASCII 73)
42JJ42112133J (ASCII 74)
43KK43112331K (ASCII 75)
44LL44132131L (ASCII 76)
45MM45113123M (ASCII 77)
46NN46113321N (ASCII 78)
47OO47133121O (ASCII 79)
48PP48313121P (ASCII 80)
49QQ49211331Q (ASCII 81)
50RR50231131R (ASCII 82)
51SS51213113S (ASCII 83)
52TT52213311T (ASCII 84)
53UU53213131U (ASCII 85)
54VV54311123V (ASCII 86)
55WW55311321W (ASCII 87)
56XX56331121X (ASCII 88)
57YY57312113Y (ASCII 89)
58ZZ58312311Z (ASCII 90)
59[[59332111[ (ASCII 91)
60\\60314111\ (ASCII 92)
61]]61221411] (ASCII 93)
62^^62431111^ (ASCII 94)
63__63111224_ (ASCII 95)
64NUL`64111422` (ASCII 96)
65SOHa65121124a (ASCII 97)
66STXb66121421b (ASCII 98)
67ETXc67141122c (ASCII 99)
68EOTd68141221d (ASCII 100)
69ENQe69112214e (ASCII 101)
70ACKf70112412f (ASCII 102)
71BELg71122114g (ASCII 103)
72BSh72122411h (ASCII 104)
73HTi73142112i (ASCII 105)
74LFj74142211j (ASCII 106)
75VTk75241211k (ASCII 107)
76FFl76221114l (ASCII 108)
77CRm77413111m (ASCII 109)
78SOn78241112n (ASCII 110)
79SIo79134111o (ASCII 111)
80DLEp80111242p (ASCII 112)
81DC1q81121142q (ASCII 113)
82DC2r82121241r (ASCII 114)
83DC3s83114212s (ASCII 115)
84DC4t84124112t (ASCII 116)
85NAKu85124211u (ASCII 117)
86SYNv86411212v (ASCII 118)
87ETBw87421112w (ASCII 119)
88CANx88421211x (ASCII 120)
89EMy89212141y (ASCII 121)
90SUBz90214121z (ASCII 122)
91ESC{91412121{ (ASCII 123)
92FS|92111143| (ASCII 124)
93GS}93111341} (ASCII 125)
94RS~94131141~ (ASCII 126)
95 (Hex 7F)USDEL95114113DEL (ASCII 127)
96 (Hex 80)FNC 3FNC 396114311Ç (ASCII 128)
97 (Hex 81)FNC 2FNC 297411113ü (ASCII 129)
98 (Hex 82)SHIFTSHIFT98411311é (ASCII 130)
99 (Hex 83)CODE CCODE C99113141â (ASCII 131)
100 (Hex 84)CODE BFNC 4CODE B114131ä (ASCII 132)
101 (Hex 85)FNC 4CODE ACODE A311141à (ASCII 133)
102 (Hex 86)FNC 1FNC 1FNC 1411131å (ASCII 134)
103 (Hex 87)START (Code A)211412‡ (ASCII 135)
104 (Hex 88)START (Code B)211214ˆ (ASCII 136)
105 (Hex 89)START (Code C)211232‰ (ASCII 137)
106 (Hex 6A)STOP (All Codes)2331112Š (ASCII 138)
xoyozo 6 年前
10,837

* 仅列出部分数据表及字段


mag_ads 广告

类型注释
id
int
titlevarchar标题
picvarchar图片
begin_timeint开始时间
end_timeint结束时间
linkvarchar链接
……



mag_circle 圈子(相当于 PC 版的版块)

类型注释
id
int
namevarchar名称
……


mag_common_applaud_(n) 点赞详情表(分表)n 与 content_id 末位一致

类型注释
id
int
typevarchar 类型(主题/回复/打卡等)
content_idint 内容 id,末位与表名后缀一致
user_idint 用户 id
statusint1:点赞;0:取消点赞


mag_common_attachment_(n) 附件详情表(分表)n 与 aid 末位一致

类型注释
aid
int附件ID(末位与表名后缀一致)
……


mag_common_attachment_index 附件索引表

类型注释
idint附件ID
user_idint用户ID
table_idint分表标志
……



mag_common_comment_index 评论索引表(相当于 PC 版的回复表)

类型注释
idint附件ID
content_idint文章ID(mag_show_content)
user_idint用户ID
contentvarchar评论内容
……



mag_common_content_log 对圈子内容的操作日志(点赞、评论等)

类型注释
idint
typevarchar用户ID
type_valueint内容ID
user_idint用户ID
create_timeint操作时间
……


mag_show_content 圈子内容(相当于 PC 版的主题表)

类型注释
idint
user_idint用户ID
contentvarchar内容
picsvarchar以半角逗号分隔的图片(附件)id
……



mag_user 用户表

类型注释
user_idint用户ID
namevarchar用户名/昵称
headvarchar头像
……



xoyozo 6 年前
4,184