博客 (624)

重点提前看:


https://xoyozo.net/Blog/Details/MySQL-on-Windows




Connector/Net 6.10.4(暂)不支持在 Visual Studio 2015/2017 添加 ADO.NET 实体数据模型时选择 MySQL Data Provider 数据源。并且,在编译项目时会出现“违反了继承安全性规则”的异常。


只能降回 Connector/Net 6.9.10,NuGet 中将 MySql.DataMySql.Data.Entity 用 6.9.10 和 6.10.4 版本皆可(除非遇到下文中提到的异常)。

重新生成或重启 VS 使之生效。


另外,MySql.DataMySql.Data.Entity 6.9.10 可以配合 EnityFrameworkEntityFramework.zh-Hans 6.1.x6.2.0 使用。


MySql.Data 和 MySql.Data.Entity 6.9.9 在创建/更新实体模型向导中会出现闪退,更换为 6.9.10 试试。

或重新安装 Connector/NET 和 MySQL for Visual Studio 并重启电脑试试。

仍然闪退,参此文:https://xoyozo.net/Blog/Details/mysql-for-vs-flashback


重要提醒,如果在添加 EF 模型时报错:

您的项目引用了最新版的实体框架;但是,找不到进行数据连接所需的与此版本兼容的实体框架数据库提供程序。请退出向导,安装兼容提供程序,重新生成您的项目,然后再执行此操作。

那么在菜单中选择:生成 - 清理解决方案,然后直接添加数据模型。如果在添加前生成了项目(bin 目录下有相关 .dll 文件),那么将出现上述错误。


类型“MySql.Data.MySqlClient.MySqlProviderServices”违反了继承安全性规则。派生类型必须与基类型的安全可访问性匹配或者比基类型的安全可访问性低。

将 MySql.Data 和 MySql.Data.Entity 从 6.10.4 退回 6.9.10 版本即可。


以上问题出现在:

VS 15.4.*

VS 15.4.4

VS 15.4.5

----------------

VS 15.5 已经可以在 EF 向导中连接 MySQL 数据库(Connector/Net 6.10.4),但 MySql.Data.Entity 6.10.4 编译仍然出现“违反了继承安全性规则”。另:MySQL 官网下架了 Connector/Net 6.10.4,退回提供 6.9.10 版本。

2017-12-9 发布的 Connector/Net 6.10.5 仍然存在无法在 EF 向导中连接 MySQL 数据源的问题。


服务器上安装 Connector/Net 6.10.4 没有任何问题。


表“TableDetails”中列“IsPrimaryKey”的值为 DBNull。怎么办?

xoyozo 8 年前
7,244

在 Windows 上安装 MySQL Server,提示需要安装 Microsoft Visual C++ 2013 Redistributable,但 MySQL Installer 安装向导中提供的 C++ 是 12.0.30501 版本:

未命名-1.png

导致无法正常安装 MySQL Server,仍然提示:

This application requires Visual Studio 2013 Redistributable. Please install the Redistributable then run this installer again.

未命名-2.png

解决办法是下载安装 Update for Visual C++ 2013 and Visual C++ Redistributable Package,即 12.0.40649.5 版本

未命名-3.png

未命名-4.png

安装成功

xoyozo 8 年前
6,596

image.png

更新 .edmx 文件时若提示:

生成模型时出现意外错误。有关详细信息,请参阅输出窗口。异常消息:“StrongTypingException: 表“TableDetails”中列“IsPrimaryKey”的值为 DBNull。”。


可以通过以下方法来解决:

1,控制面板中打开“服务”(或执行命令 services.msc),重新启动“MySQL57”

2,在 MySQL 中执行:

use <<database name>>;
set global optimizer_switch='derived_merge=OFF';

如果提示“1227 - Access denied; you need (at least one of) the SUPER privilege(s) for this operation”,请使用超级用户进行操作。

3,搞定,试试更新 .edmx 吧。


参考资料:https://stackoverflow.com/questions/33575109/mysql-entity-the-value-for-column-isprimarykey-in-table-tabledetails-is

xoyozo 8 年前
5,722

获取

在 NuGet 中搜索 ZXing.Net

Demo


简单示例

var qr = new ZXing.QrCode.QRCodeWriter();
var matrix = qr.encode("http://xoyozo.net/", ZXing.BarcodeFormat.QR_CODE, 200, 200);
var writer = new ZXing.BarcodeWriter()
{
    Format = ZXing.BarcodeFormat.QR_CODE
};
Bitmap bitmap = writer.Write(matrix);


扩展示例

string content = "http://xoyozo.net/";

var hints = new Dictionary<ZXing.EncodeHintType, object>();
hints.Add(ZXing.EncodeHintType.ERROR_CORRECTION, ZXing.QrCode.Internal.ErrorCorrectionLevel.H); // 纠错级别
hints.Add(ZXing.EncodeHintType.CHARACTER_SET, Encoding.Default.WebName); // 编码:gb2312
hints.Add(ZXing.EncodeHintType.MARGIN, 0); // 出血码元数(标准为 4,美观为 2)

var qr = new ZXing.QrCode.QRCodeWriter();
var matrix = qr.encode(content, ZXing.BarcodeFormat.QR_CODE, 200, 200, hints);
var writer = new ZXing.BarcodeWriter()
{
    Format = ZXing.BarcodeFormat.QR_CODE,
    Renderer = new ZXing.Rendering.BitmapRenderer
    {
        Foreground = Color.Black, // 前景色(默认黑色)
        Background = Color.White, // 背景色(默认白色)
    },
};

Bitmap bitmap = writer.Write(matrix);


将 Bitmap 写入到流

Stream stream = new MemoryStream();
bitmap.Save(stream, ImageFormat.Png);


将 Bitmap 保存到磁盘

string path = "D:\wwwroot\upload\abc.png";
bitmap.Save(path, ImageFormat.Png);


更多

使用 ThoughtWorks.QRCode 生成二维码

对比 ThoughtWorks.QRCode 和 ZXing.Net


xoyozo 8 年前
9,795

获取

在 NuGet 中搜索 ThoughtWorks.QRCode

Demo


简单示例

var qr = new ThoughtWorks.QRCode.Codec.QRCodeEncoder();
Bitmap bitmap = qr.Encode("http://xoyozo.net/");


扩展示例

string content = "http://xoyozo.net/";

var qr = new ThoughtWorks.QRCode.Codec.QRCodeEncoder
{
    // 纠错级别,L (7%)、M (15%)、Q (25%)、H (30%)
    QRCodeErrorCorrect = ThoughtWorks.QRCode.Codec.QRCodeEncoder.ERROR_CORRECTION.H,
    // 码元尺寸(像素)
    QRCodeScale = 4,
    // 前景色(默认黑色)
    QRCodeForegroundColor = Color.Black,
    // 背景色(默认白色)
    QRCodeBackgroundColor = Color.White,
};

// 根据内容确定 Mode,参:http://en.wikipedia.org/wiki/QR_code#Storage
if (Regex.IsMatch(content, @"^\d+$"))
{
    qr.QRCodeEncodeMode = ThoughtWorks.QRCode.Codec.QRCodeEncoder.ENCODE_MODE.NUMERIC;
}
else if (Regex.IsMatch(content, @"^[0-9A-Z $%*+-./:]+$"))
{
    qr.QRCodeEncodeMode = ThoughtWorks.QRCode.Codec.QRCodeEncoder.ENCODE_MODE.ALPHA_NUMERIC;
}
else
{
    qr.QRCodeEncodeMode = ThoughtWorks.QRCode.Codec.QRCodeEncoder.ENCODE_MODE.BYTE;
}

Bitmap bitmap = qr.Encode(content, Encoding.Default); // 编码,简体中文系统默认为 gb2312


裁切掉多余的 1 像素

ThoughtWorks.QRCode 生成的四周没有留白的二维码图片,其右边和下边分别会多出 1 像素,使用以下方法来调整图片大小

// 创建一个新的图片(宽度和高度各缩小 1 像素)
Bitmap bitmap2 = new Bitmap(bitmap.Size.Width - 1, bitmap.Size.Height - 1);
// 以新图片来绘图
Graphics g2 = Graphics.FromImage(bitmap2);
// 新旧图片绘制到新图片中(左上角对齐)
g2.DrawImage(bitmap, 0, 0);


将 Bitmap 写入到流

Stream stream = new MemoryStream();
bitmap.Save(stream, ImageFormat.Png);

若已裁切 1 像素,请修改为 bitmap2


将 Bitmap 保存到磁盘

string path = "D:\wwwroot\upload\abc.png";
bitmap.Save(path, ImageFormat.Png);

若已裁切 1 像素,请修改为 bitmap2


更多

使用 ZXing.Net 生成二维码

对比 ThoughtWorks.QRCode 和 ZXing.Net


xoyozo 8 年前
7,761

ThoughtWorks.QRCodeZXing.Net
生成方式以指定的码元大小、版本、模式、纠错级别等信息来确定最终生成的图片大小指定图片大小后,自动调整码元大小、出血*
关于图片尺寸不能直接确定最终生成的二维码图片的尺寸,可以先反向估算码元大小,再微调码元大小,直到不小于目标尺寸,如果必须严格限制尺寸,建议在 jpg 方式处理,因为 png 二维码的每个像素点非 0 即 1,在小尺寸的情况下会导致无法识别。(涉及到多次生成二维码,请斟酌性能消耗)生成二维码时即指定图片大小,但会留白,比较难以掌控实际效果
"BUG"右边和下边有多余 1 像素需要手动去除虽然可以设置参数 EncodeHintType.MARGIN,但还是没有达到预期的效果(网上有解析原因,请自行搜索)
……

*出血:为了提高二维码识别度,在生成的二维码四周留出若干码元(建议 4 个)空白。

更多

使用 ThoughtWorks.QRCode 生成二维码

使用 ZXing.Net 生成二维码







xoyozo 8 年前
6,903

状态:正在连接 *.*.*.*:21...

状态:连接建立,等待欢迎消息...

响应:220-FileZilla Server

响应:220-written by Tim Kosse (tim.kosse@filezilla-project.org)

响应:220 Please visit https://filezilla-project.org/

命令:AUTH TLS

错误:无法连接到服务器


最终,没有连接到任何服务器。

服务端已允许被动连接,并且 VS 中的网站发布功能正常(FTP 方式),所以从 FileZilla 客户端入手查找问题。

在站点管理器中发现“加密”项,默认是“如果可用,使用显式的 FTP over TLS”,更改为“只使用普通 FTP (不安全)”即可连接。

image.png

这个问题一般出现在换了网络环境的情况下,研究一下 FTP over TLS 很有必要。

打开 FillZilla Server - Edit - Settings - 切换到 FTP over TLS settings 选项卡

FTP over TLS.png

勾选 Enable FTP over TLS support (FTPS),点击 Generate new certificate...

填写需要生成的证书信息,其中“2-Digit country code”和“Save key and certificate to this file”必填,点击 Generate certificate 完成生成证书。

完成配置后 FillZilla Server 已支持 FTPS,启动页上的警告也会随之不见:

Warning: FTP over TLS is not enabled, users cannot securely log in.


xoyozo 8 年前
11,332

jquery.barrager.js 是一款优雅的网页弹幕插件,支持显示图片,文字以及超链接。支持速度、高度、颜色、数量等自定义。

使用方法参官方网站:http://yaseng.org/jquery.barrager.js/

jquery.barrager.min.js 会报错,改用 jquery.barrager.js(版本 1.1)

实战示例:https://xoyozo.net/Demo/DanMu

该示例重写了部分 CSS 样式。

注:info 属性支持 HTML,因此要自己过滤危险标签,建议仅保留 <img /> 标签

如果要显示在指定区域,可以使用 bottom 属性,例:

bottom: (Math.random() * (0.95 - 0.5) + 0.5) * $(window).height()

建议加 loading 锁,以适应网络不通畅的环境(ajax 时间超过定时间隔会导致请求到重复的数据)

跨域环境可以使用 JSONP 来实现,服务器端需设置 Access-Control-Allow-Origin 为 *。

xoyozo 8 年前
10,130

Session 有多种存储模式,默认是 InProc,顾名思义是“在进程内”,即在 IIS 中,随网站重启而重启,网站发布后(或改动 .dll 文件)会导致应用重新运行,Session 清空。

Session 可以使用 StateServer 来保存,需要服务器开启 ASP.NET State Service 服务,此种方式要求保存在 Session 的信息必须序列化,然后从 Session 中获取的时候也要反序列化,这就导致性能有略微的损失。

Session 还可以配置为 SQLServer,将 Session 存储在数据库中,同样需要序列化。

当配置为 Custom 时,可以在使用 Memcached、Redis 等第三方缓存技术来实现 Session 的管理,本文不作讨论。

Off 模式即关闭 Session,这种方式如果要实现用户登录功能,就必须依赖 Cookie 等来实现。

下面针对常见的三种模式进行比较:


InProcStateServerSQLServer
存储位置应用进程内ASP.NET State Service 服务SQL Server 数据库
远程存储不支持支持支持
存储格式
任意序列化的序列化的
可能导致重启(丢失)的情况

配置文件中 processModel 标签的 memoryLimit 属性;

Global.asax 或者 Web.config 文件被更改;

Bin 文件夹中的 Web 程序(DLL)被修改;

杀毒软件扫描了一些 .config 文件;

系统资源紧张进行资源回收导致 IIS 进程崩溃或重启等。

ASP.NET State Service 服务停止;-
Session_End() 事件
部署难度简单稍复杂

Web.config 配置示例

(<system.web> 节点内)

<sessionState mode="InProc" /><sessionState mode="StateServer" /><sessionState mode="SQLServer" sqlConnectionString ="data source=x.x.x.x; user id=[user]; password=[pwd]" />

因此,如果你仅仅为了标题所述的“每次发布后丢失 Session”而烦恼,那么推荐使用 StateServer 模式来存储 Session。


注:

如果 Session 的 Key 是在应用启动时随机生成的话,使用 StateServer 和 SQLServer 还是会“丢失” Session。

这是对 Session 的配置,对 Cache 无效。

xoyozo 8 年前
5,662

这个简单的技巧用来解决使固定表头(thead)和滚动表体 (tbody) 的问题。这使得数据表更易于浏览。当用户滚动表格时,固定表头为用户所注意的列提供了上下文。看下面图示你就明白了:

默认情况下,overflow 属性不适用于表格分组元素 theadtbody , tfoot。你可以在下面的示例中看到:

示例

为了使其工作,

第一步是:设置 tbody 为 display:block ,以便我们可以应用 height 和 overflow 属性。

下一步将是:设置thead 中的 tr元素设置为 display:block

所以最终的CSS会是:

.fixed_header tbody{
  display:block;
  overflow:auto;
  height:200px;
  width:100%;
}
.fixed_header thead tr{
  display:block;
}

完整示例

这样,创建表格非常简单而且富有语义,并且没有依赖 JavaScript 。

c
转自 css88 8 年前
3,821