如何在不实际安装连接器的情况下通过 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 数据库设置连接字符串?

如何在不使用 sudo 的情况下从终端窗口关闭 Internet 连接?

如何在不使用 IDE 的情况下更改 C# 程序的图标?

如何在不重新编译的情况下配置我的 C# 项目? [复制]

如何在不安装的情况下使用数据库?

我们可以在不使用 SAS 令牌的情况下通过 c# 代码调用 Azure API 管理吗