如何在不实际安装连接器的情况下通过 C# 使用 mysql 连接器连接到 mysql
Posted
技术标签:
【中文标题】如何在不实际安装连接器的情况下通过 C# 使用 mysql 连接器连接到 mysql【英文标题】:How to connect to mysql using mysql connector via C# without actually installing the connector 【发布时间】:2011-09-17 18:09:22 【问题描述】:我们有一个基于 dot net 2.0 的 C# 产品,它使用 mysql 作为数据存储。当我们在 XP/Win 7 机器上安装 mysql 连接器 6.3.6 时,我们能够从 C# 代码连接到数据库而没有任何问题。但是我们在连接到 mysql 数据库时遇到了一个问题,因为 mysql 连接器实际上没有安装在机器上,而只是存在于与可执行文件相同的目录中。我们不想在希望产品运行的每台机器上都安装连接器。我们希望直接使用连接器 dll,因为我们在代码中使用任何 3rd 方 dll(例如记录器)。
即使我们将 mysql.data.dll 复制到安装 exe 的同一目录中,它也会构建但不会连接到数据库。
给出的错误是
找不到请求的 .Net Framework 数据提供程序。它可能没有安装 块引用
技术信息:
Mysql 5.0 C# 点网框架 2.0 Mysql 连接器 6.3.6(6.0.3 版本的 sql 连接器出现同样的问题) Win XP/Win 7我们在使用ASP.Net的时候,可以在web.config中指定下面给出的标签,直接把dll放到bin目录下就可以连接mysql数据库了
<system.data>
<DbProviderFactories>
<add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=5.0.6.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
</DbProviderFactories>
</system.data>
为什么我们不能在 C# 中为桌面环境中的客户端服务器应用程序做同样的事情。
【问题讨论】:
你的桌面应用的app.config
是否也放入了同样的配置?
我们没有在 app.config 中放置相同的配置。标签 DBProviderFactories 在 app.config 中似乎无效
这个问题在一个月前可以让我省去几个小时的头痛。所有 .Net 连接器安装(据我了解)是将“MySQL 数据提供程序”条目添加到 machine.config。我没有使用安装程序,只是将条目添加到我的配置中。我使用 .Net ProviderFactories 关闭并运行。
【参考方案1】:
尝试这样的事情(我没有检查任何可能的版本/配置,但它目前适用于我的 Vista x64 for MySql some 5.5... 和 .net connector 6.4.3.0 - 使用 mysql.data.dll for v4从 .net/mono 下载)。
确保下面引用的 mysql.data.dll 程序集在您的当前目录中。
使用(var dt = new DataTable()) dt.Columns.Add("名称"); dt.Columns.Add("描述"); dt.Columns.Add("InvariantName"); dt.Columns.Add("AssemblyQualifiedName"); dt.Rows.Add("Mysql 的东西", “mysql更多”, "mysql客户端", “MySql.Data.MySqlClient.MySqlClientFactory,MySql.Data,版本=6.4.3.0,文化=中性,PublicKeyToken=c5687fc88969c44d”); var f = DbProviderFactories.GetFactory(dt.Rows[0]); 使用(var conn = f.CreateConnection()) conn.ConnectionString = "你的字符串在这里"; conn.Open(); // 在这里做你的工作。 Console.WriteLine(conn);【讨论】:
嗨,它对我有用。使用这种方法比安装连接器是否有缺点,比如在编码、性能或安全等方面 除了你必须为所有需要它的应用程序复制 mysql.data.dll 之外,这种方法没有任何缺点。所以如果你只有一个,那么这完全没问题。在我的情况下,有几个所以我最终将 mysql 程序集放在 GAC 中并在所有正确的地方修改 machine.config,这样我就可以使用 DbProviderFactories.GetFactory("string here I given in configs") 来获取工厂并从那里。我只是喜欢使用 .net/mono 发行版中的那些 dll,因此不得不手动设置。【参考方案2】:这个page 没有详细介绍 .NET Framework 依赖关系,但我怀疑 Mysql 连接器可能依赖于更高版本的 .NET Framework。
也就是说,你的应用使用的是Framework 2,但是Mysql连接器使用的是什么版本呢?
【讨论】:
兼容点网的v2和v4。 6.3.* 与 ADO.NET 版本 2.x+、.NET Framework 版本 2.x+、4.x+ 兼容,以支持 VS 2010 和 MySQL Server 版本 5.0、5.1、5.4、5.5 mysql网站 我指的是链接dev.mysql.com/doc/refman/5.0/en/connector-net-versions.html 它明确指出连接器在 .net framework 2.0 上工作。我们甚至尝试使用 6.0.3 版的连接器,但它给出了相同的错误 我现在也有类似的问题。出于某种原因,v2.0 程序集引用了 System.Xaml 和其他的 v4.0 版本。我怀疑一些奇怪而邪恶的 GAC 魔法在起作用,解决方法是从源代码编译 .Net 连接器【参考方案3】:此条目:
<system.data>
<DbProviderFactories>
<add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=5.0.6.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
</DbProviderFactories>
</system.data>
... 需要写入您的 machine.config。
我相信默认路径应该是这样的:
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG
更新 您应该能够将 MySQL .Net/Connector 安装程序作为安装包的一部分。 machine.config 中的条目是必需的,原因与 web.config 中需要信息的原因相同。
【讨论】:
安装软件的人技术上不靠谱。所以我们不能让他们手动添加这个条目。是否可以通过 NSIS 安装程序输入此条目。 为什么首先需要这个条目是我的问题以上是关于如何在不实际安装连接器的情况下通过 C# 使用 mysql 连接器连接到 mysql的主要内容,如果未能解决你的问题,请参考以下文章
如何在不使用对话框的情况下为 C# 项目中的 MySQL 数据库设置连接字符串?