简介:MySQL Connector/Net 6.8.3 免安装版是面向 .NET 开发者的官方数据库驱动包,用于让 C#、VB.NET 等应用通过 ADO.NET 接口连接并操作 MySQL 服务器,支持查询、事务、存储过程等常见场景。压缩包共 21 个文件,约 3.45MB,以 13 个 dll 运行库为主,另含 html 许可说明、chm 帮助文档、readme、changes 与 txt 发布说明等,按 .NET 版本分目录组织,便于按目标框架取用。已有 278 人学习下载。包内按 v2.0、v4.0、v4.5 等目录提供对应程序集,并附 RT 运行时组件与 Documentation 文档,读者可据此快速完成手动部署、版本选型与升级评估,同时借助发布说明和变更记录排查兼容性问题,在遵守开源许可的前提下正确集成驱动。
1. 从 mysql-connector-net-6.8.3-noinstall.zip 说起:一个压缩包为什么能省掉半小时装机时间
如果你在维护一套 .NET Framework 的老系统,某天需要连 MySQL,打开 NuGet 搜MySql.Data,装完发现版本对不上、GAC 里多了一份、卸载还卸不干净——这时候mysql-connector-net-6.8.3-noinstall.zip就是那个「后悔药」。它本质上是 MySQL 官方 Connector/NET 的免安装压缩包,解压出来是一堆 DLL 和文档,不写注册表、不装 GAC、不改 machine.config,你引用哪个版本、拷到哪个目录,完全自己说了算。适合谁?维护 .NET Framework 4.x 老项目、需要固定驱动版本、或者服务器不允许跑 MSI 安装程序的场景。这篇就按「解压 → 引用 → 配置 → 排错」的路径,把 noinstall 包怎么用讲透,顺带把 zip 解压、路径、版本冲突这些常见坑一起填了。
2. 先搞清楚 noinstall 包里到底有什么:DLL 清单与版本对应关系
2.1 解压后目录结构与关键文件
拿到mysql-connector-net-6.8.3-noinstall.zip,用系统自带解压或 7-Zip 解开,典型结构是这样的(不同小版本可能略有差异,但核心文件一致):
mysql-connector-net-6.8.3-noinstall/ ├── MySql.Data.dll ├── MySql.Data.Entity.EF6.dll ├── MySql.Web.dll ├── README ├── CHANGES ├── docs/ └── samples/真正要关心的只有三个 DLL:
| 文件 | 作用 | 什么时候需要 |
|---|---|---|
| MySql.Data.dll | 核心 ADO.NET 驱动,提供 MySqlConnection、MySqlCommand | 所有连 MySQL 的场景 |
| MySql.Data.Entity.EF6.dll | Entity Framework 6 的 MySQL Provider | 项目用 EF6 + MySQL |
| MySql.Web.dll | ASP.NET Membership / Role Provider | 老式 WebForms 项目用 MySQL 做成员管理 |
MySql.Data.dll是强命名程序集,6.8.3 对应的 AssemblyVersion 是6.8.3.0。这一点很关键:如果你项目里其他地方引用了不同版本的 MySql.Data,运行时会抛Could not load file or assembly 'MySql.Data, Version=x.x.x.x'。noinstall 包的好处就在这里——你可以把 6.8.3 的 DLL 单独放在libs/或packages/目录,用<bindingRedirect>精确控制加载哪个版本,而不是被 GAC 里那个「不知道谁装上去的」版本劫持。
2.2 为什么选 noinstall 而不是 MSI
MSI 安装包会做三件事:写 GAC、注册 machine.config 的 DbProviderFactories、可能还装一个 Visual Studio 设计器插件。这三件事在开发机上方便,在服务器上就是灾难——你没法保证测试环境和生产环境装的是同一个版本,卸载时 GAC 里的残留还得手动清。
noinstall 包把选择权交回来:DLL 跟着项目走,版本在app.config或web.config里写死,部署时把 DLL 一起拷过去就行。常见做法是在解决方案根目录建一个libs/MySql.Data.6.8.3/,把 DLL 放进去,所有项目引用这个路径。这样 CI 构建、本地调试、生产部署用的是同一份二进制,玄学问题少一大半。
2.3 验证 DLL 版本与目标框架
解压后别急着引用,先确认两件事。第一,用 PowerShell 看一下程序集版本和目标框架:
# 查看 MySql.Data.dll 的程序集版本和目标运行时 $dll = [System.Reflection.AssemblyName]::GetAssemblyName("C:\path\to\MySql.Data.dll") $dll.Version $dll.ProcessorArchitecture第二,确认你的项目目标框架。6.8.3 的 MySql.Data.dll 同时提供 .NET Framework 4.0 和 4.5 两个版本(在docs/或子目录里可能分开放)。如果你的项目是 .NET Framework 4.0,却引用了 4.5 编译的 DLL,编译能过,运行时可能抛FileLoadException。我一般会在项目文件里显式写<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>,然后引用对应版本的 DLL,避免这种「编译通过、运行翻车」的情况。
3. 在 .NET Framework 项目里引用 noinstall 版驱动的完整步骤
3.1 把 DLL 放进项目并添加引用
假设你已经解压到D:\libs\mysql-connector-net-6.8.3-noinstall\,项目在D:\src\MyOldApp\。推荐做法是把 DLL 拷到解决方案下的libs\目录,而不是直接引用解压目录——解压目录随时可能被清理。
# 在解决方案根目录创建 libs 目录并拷贝 DLL mkdir -p D:\src\MyOldApp\libs\MySql.Data.6.8.3 copy D:\libs\mysql-connector-net-6.8.3-noinstall\MySql.Data.dll D:\src\MyOldApp\libs\MySql.Data.6.8.3\ copy D:\libs\mysql-connector-net-6.8.3-noinstall\MySql.Data.Entity.EF6.dll D:\src\MyOldApp\libs\MySql.Data.6.8.3\然后在 Visual Studio 里右键项目 → 添加引用 → 浏览 → 选中libs\MySql.Data.6.8.3\MySql.Data.dll。注意引用属性里的「复制本地」要设为 True,这样编译输出目录里会有 DLL,部署时不会漏。
如果你用旧式.csproj,也可以直接编辑项目文件,加一个<Reference>节点,把<HintPath>指向相对路径。这样团队里其他人拉代码后不用手动加引用:
<ItemGroup> <Reference Include="MySql.Data, Version=6.8.3.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, processorArchitecture=MSIL"> <HintPath>..\libs\MySql.Data.6.8.3\MySql.Data.dll</HintPath> <Private>True</Private> </Reference> </ItemGroup>PublicKeyToken=c5687fc88969c44d是 MySQL 官方程序集的固定公钥标记,写上去能防止引用到同名的第三方 DLL。Private=True等价于「复制本地」。
3.2 配置连接字符串与 DbProviderFactory
引用加好后,在app.config或web.config里加连接字符串。6.8.3 的连接字符串语法和后续版本基本一致,但有几个参数在老版本里行为不同,后面避坑章节会讲。
<configuration> <connectionStrings> <add name="MySqlConn" connectionString="Server=127.0.0.1;Port=3306;Database=mydb;Uid=appuser;Pwd=YourPassword;CharSet=utf8mb4;SslMode=None;" providerName="MySql.Data.MySqlClient" /> </connectionStrings> </configuration>如果你用DbProviderFactories动态创建连接(比如某些 ORM 框架),还需要在system.data节点里注册:
<system.data> <DbProviderFactories> <remove invariant="MySql.Data.MySqlClient" /> <add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.8.3.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" /> </DbProviderFactories> </system.data>remove那行是为了防止 machine.config 里已经注册了别的版本,先移除再添加,保证用的是你项目目录下的 6.8.3。
3.3 写一段最小可运行代码验证连通性
配置完别急着跑业务代码,先用一段控制台代码验证驱动能加载、能连上、能查数据:
using System; using System.Data; using MySql.Data.MySqlClient; class Program { static void Main() { string connStr = "Server=127.0.0.1;Port=3306;Database=mydb;Uid=appuser;Pwd=YourPassword;CharSet=utf8mb4;SslMode=None;"; using (var conn = new MySqlConnection(connStr)) { try { conn.Open(); Console.WriteLine("ServerVersion: " + conn.ServerVersion); using (var cmd = new MySqlCommand("SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = DATABASE()", conn)) { var count = Convert.ToInt32(cmd.ExecuteScalar()); Console.WriteLine("Table count: " + count); } } catch (MySqlException ex) { Console.WriteLine("MySQL error " + ex.Number + ": " + ex.Message); } } } }这段代码做了三件事:conn.Open()验证网络和认证;conn.ServerVersion验证驱动和服务器握手成功;ExecuteScalar验证能执行查询。如果Open()就抛异常,看ex.Number:1045 是密码错,1049 是库不存在,2003 是端口不通或防火墙。如果编译时报「找不到 MySqlConnection」,说明引用没加对,回去检查 HintPath。
4. 版本冲突、GAC 劫持与 zip 解压的避坑清单
4.1 现象:运行时抛 Could not load file or assembly 'MySql.Data, Version=6.8.3.0'
原因:项目引用了 6.8.3,但 GAC 里装了 6.9.x 或 8.x,运行时按强名称先加载了 GAC 里的版本,版本号对不上就抛异常。或者某个依赖库内部引用了不同版本的 MySql.Data,CLR 加载时产生冲突。
解决:在app.config里加bindingRedirect,把所有版本重定向到 6.8.3:
<runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="MySql.Data" publicKeyToken="c5687fc88969c44d" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-6.8.3.0" newVersion="6.8.3.0" /> </dependentAssembly> </assemblyBinding> </runtime>oldVersion="0.0.0.0-6.8.3.0"表示从任意版本到 6.8.3 都重定向到 6.8.3。如果项目里还有别的库依赖更高版本,就得权衡是升级驱动还是隔离加载域,后者成本很高,一般建议统一版本。
4.2 现象:解压 zip 后 DLL 被 Windows 标记为「来自其他计算机」,引用时报安全异常
原因:从网络下载的 zip 文件,Windows 会给里面的文件打上 Zone.Identifier 标记,.NET 加载时会检查这个标记,可能阻止加载。
解决:解压前右键 zip 文件 → 属性 → 勾选「解除锁定」,再解压。如果已经解压了,用 PowerShell 批量解除:
Get-ChildItem -Path "D:\libs\mysql-connector-net-6.8.3-noinstall" -Recurse | Unblock-File这个坑在服务器上尤其常见,因为服务器上往往没有交互式桌面,只能靠命令行解除。
4.3 现象:连接字符串里写了 SslMode=Required,但服务器没配 SSL,连接直接失败
原因:6.8.3 对 SSL 的处理和后续版本不同,某些小版本默认行为是SslMode=Preferred,但如果显式写了Required而服务器不支持,就会抛MySqlException: SSL connection error。
解决:内网环境且不要求加密时,显式写SslMode=None。如果确实需要 SSL,确认服务器端已启用 SSL 并且证书路径正确。注意 6.8.3 不支持SslMode=VerifyFull这种后续版本才有的选项,写了会报「不支持的关键字」。
4.4 现象:CharSet 设了 utf8mb4,但插入 emoji 还是报 Incorrect string value
原因:连接字符串的 CharSet 只影响客户端和服务器之间的字符集协商,表本身的字符集和排序规则如果是 utf8(三字节),存四字节的 emoji 依然会失败。
解决:确认三件事——数据库默认字符集、表字符集、列字符集都是 utf8mb4。用SHOW CREATE TABLE your_table检查,如果不是,执行ALTER TABLE your_table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;。连接字符串里写CharSet=utf8mb4只是第一步,服务端存储层也得支持。
4.5 现象:noinstall 包解压后找不到 MySql.Data.Entity.EF6.dll,EF6 项目无法运行
原因:某些 noinstall 包的目录结构里,EF6 的 DLL 放在子目录(比如EntityFramework/或docs/旁边),不在根目录。或者你下载的包本身不包含 EF6 组件。
解决:解压后先用dir /s /b *.dll列出所有 DLL,确认 EF6 的 DLL 在哪个路径。如果确实没有,说明这个 noinstall 包只含核心驱动,EF6 支持需要单独获取。这种情况下,要么换一个包含 EF6 的完整包,要么在项目里用核心驱动手写 ADO.NET 访问层,放弃 EF6 的 MySQL Provider。
5. 进阶:把 noinstall 驱动做成可复用的内部 NuGet 包
5.1 为什么要自己打包
团队里多个项目都要连 MySQL,每个项目都手动拷 DLL、加引用、写 bindingRedirect,迟早会有人漏掉某一步。把 6.8.3 的 noinstall 驱动做成内部 NuGet 包,版本号写死,所有项目用同一个包,升级时改一处就行。这不是为了炫技,是为了减少「我这里能跑你那里报错」的扯皮。
5.2 用 nuget pack 从 nuspec 生成包
先建一个工作目录,结构如下:
MySql.Data.6.8.3.Internal/ ├── lib/ │ └── net45/ │ └── MySql.Data.dll ├── MySql.Data.6.8.3.Internal.nuspec └── build/ └── MySql.Data.6.8.3.Internal.targetsnuspec文件内容:
<?xml version="1.0"?> <package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd"> <metadata> <id>MySql.Data.6.8.3.Internal</id> <version>6.8.3</version> <authors>Internal</authors> <description>MySQL Connector/NET 6.8.3 noinstall, repackaged for internal use.</description> </metadata> <files> <file src="lib\net45\MySql.Data.dll" target="lib\net45\MySql.Data.dll" /> <file src="build\MySql.Data.6.8.3.Internal.targets" target="build\MySql.Data.6.8.3.Internal.targets" /> </files> </package>build目录下的.targets文件可以在安装包时自动注入 bindingRedirect 和 DbProviderFactories 配置,省去每个项目手动改 config 的麻烦:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <ItemGroup> <None Include="$(MSBuildThisFileDirectory)..\lib\net45\MySql.Data.dll"> <Link>MySql.Data.dll</Link> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> </ItemGroup> </Project>然后在工作目录执行:
nuget pack MySql.Data.6.8.3.Internal.nuspec -OutputDirectory .\out生成的.nupkg放到内部 NuGet 源(可以是文件共享目录,也可以是内部服务器),其他项目通过nuget install MySql.Data.6.8.3.Internal或 PackageReference 引用。这样版本、DLL、配置三件事绑在一起,不会漏。
5.3 验证包是否生效的检查点
装完包后,别只看「编译通过」。做三个检查:第一,输出目录里有没有MySql.Data.dll,版本是不是 6.8.3;第二,app.config里有没有自动生成的 bindingRedirect;第三,跑一遍 3.3 节的最小验证代码,确认能连上。我一般会在 CI 里加一个冒烟测试,专门跑这段连接代码,防止有人升级了包但没更新配置。
5.4 一个我踩过的坑:包版本号与程序集版本号不一致
内部 NuGet 包的<version>是 6.8.3,但 DLL 的 AssemblyVersion 也是 6.8.3.0,这没问题。但如果哪天你想发一个「6.8.3-hotfix1」的包,<version>写成6.8.3.1,而 DLL 的 AssemblyVersion 还是6.8.3.0,bindingRedirect 就会对不上。血泪经验是:内部包的版本号要么和程序集版本完全一致,要么在 targets 文件里用$(AssemblyVersion)动态生成重定向,别手动写死。我现在习惯是内部包版本号只改最后一位,且每次改都同步更新 bindingRedirect 的newVersion,用脚本检查一致性,避免上线前才发现加载了旧 DLL。
希望帮到你。
本文还有配套的精品资源,点击获取