在 .NET Framework 2.0 中集成 MySQL 与 Enterprise Library






3.73/5 (12投票s)
一篇关于为 .NET Framework 2.0 的 Enterprise Library 添加 MySQL 连接器的文章

引言
我一直在研究 Microsoft 的 .NET Framework 2.0 Enterprise Library[^],并想知道将其中的数据访问应用程序块扩展以包含 MySQL 作为数据库之一会有多难。
站在巨人的肩膀上...
我发现了 Benjamin Mayrargue 的文章:Microsoft Enterprise Library 的 MySQL 连接器(2005 年 1 月版本)。我按照他所采取的步骤,只是想看看我是否能让它工作。
它不起作用,因为它针对的是 Enterprise Library 的早期版本,**但是**他的文章给了我所有必要的信息,让我可以尝试自己来做。
我还研究了 Oracle 和 SQL Server 块是如何构建的,并模仿了它们的构建方式。
假设
我做了一些假设;
- 已安装 Visual Studio 2005。(我有完整版)
- 安装 .NET 2 的 Enterprise Blocks[^](在开始进行修改之前,请检查它们是否能编译!!)
- 安装 MySQL Connector/NET 5.0[^](我使用了 Alpha 版本,我不知道它是否与 1.0 连接器一起工作)
- 最后……对你正在做的事情有一个大致的了解。:-)
背景
Microsoft 的 .NET Framework 2.0 Enterprise Library 是一个用于构建代码的框架,它灵活且可扩展。数据访问块为您提供了数据库无关的实现层,可以添加到您的代码中。尽管它是数据库无关的,但数据访问块仅提供两个现有的提供程序:SQL Server 和 Oracle。本文展示了如何将 MySQL 添加到此列表中,事实上,利用本文的思路,应该可以将任何 .NET 数据库连接器实现为数据访问块(嗯,这就是想法……但实际操作起来可能相当棘手)。
在我们开始之前...
在我们开始之前,有一个快速的警告,这段代码对我以及我的用途都有效;连接到 MySQL 并运行简单的存储过程(传入参数)。我没有做大量的工作来测试 MySQL 数据块的所有功能……老实说,它们不起作用!细心的你可能会注意到 MySQL 类中引用了一些 MSSQL 对象 - 我会找时间修复它,或者让别人帮我修复!:-)
开始动手...
我们需要经过几个步骤。它们包括添加几个新类(MySQL 数据块)以及修改数据块本身(这些已包含在源 zip 文件中)。从代码来看,我认为我不需要这样做,但这样集成会更紧密。
祝您好运!!
开始修改
- 在包含数据访问块源的目录中创建一个名为“MySql”的子文件夹,对我来说,它位于 C:\Program Files\Microsoft Enterprise Library January 2006\Src\Data\
下载源文件,并将它们复制到“mysql”文件夹中。 - 在引用中添加对 MySQL.Data DLL 的引用。
- 是时候修改数据访问块了。
在方法中(在文件 DatabaseConfigurationView.cs 中) - 在文件 DatabaseConfigurationView.cs 中添加以下行
private static readonly DbProviderMapping defaultMySqlMapping = new DbProviderMapping(DbProviderMapping.DefaultMySqlProviderName, typeof(MySqlDatabase)); private IConfigurationSource configurationSource;
因此,文件的顶部将是
public class DatabaseConfigurationView { private static readonly DbProviderMapping defaultSqlMapping = new DbProviderMapping(DbProviderMapping.DefaultSqlProviderName, typeof(SqlDatabase)); private static readonly DbProviderMapping defaultOracleMapping = new DbProviderMapping(DbProviderMapping.DefaultOracleProviderName, typeof(OracleDatabase)); private static readonly DbProviderMapping defaultGenericMapping = new DbProviderMapping(DbProviderMapping.DefaultGenericProviderName, typeof(GenericDatabase)); private static readonly DbProviderMapping defaultMySqlMapping = new DbProviderMapping(DbProviderMapping.DefaultMySqlProviderName, typeof(MySqlDatabase)); private IConfigurationSource configurationSource;
- 在 DbProviderMappings.cs 中,添加以下 XML/代码
/// <item>For provider name "System.Data.SqlClient", /// or for a provider of type <see cref="System.Data.SqlClient"/>, the /// <see cref="Microsoft.Practices.EnterpriseLibrary.Data.MySql.MySqlDatabase"/> /// will be used.</item>
很清楚在哪里添加它,它就在文件的顶部,紧靠在命名空间声明下方(与其他 XML 在一起)。
- 粘贴此代码
/// <summary> /// Default name for the MySQL managed provider. /// </summary> public const string DefaultMySqlProviderName = "MySql.Data.MySqlClient";
在以下行下方
public const string DefaultOracleProviderName = "System.Data.OracleClient";
- 你必须为 DatabaseConfigurationView.cs 和 DbProviderMappings.cs 添加一个
using MySql.Data.MySqlClient;
才能编译。
private DbProviderMapping GetDefaultMapping(string name, string dbProviderName)
添加以下代码
if (DbProviderMapping.DefaultMySqlProviderName.Equals(dbProviderName))
return defaultMySqlMapping;
应该很清楚它应该放在哪里。
大功告成
嗯,差不多了,我测试了普通的 SQL 语句,它们工作正常,存储过程也工作正常。嗯,在我测试它们的有限方式下。现在你来试试……
我创建了一个简单的演示项目来配合代码。玩得开心,告诉我你的进展!我没有提供任何 SQL 代码(希望你能用你自己的代码让它工作起来!)
关注点
除了 MySql
类之外,我还包含了数据访问块中我修改过的两个类,这样你就不用自己输入了。:-)
我发现使用应用程序块非常容易,比我预期的要容易得多,所以试试吧。
自从我写了这篇文章以来,我一直在做一些实验,并且遇到了一些关于 MySql .NET 提供程序不(完全)符合 CLS 标准的问题 [MySqlDbType
]。Klaus Frederiksen 已经在 MySql 论坛 上对此做出了回应。
测试应用程序
在测试应用程序中,设置数据库连接的第一行是
Database db = DatabaseFactory.CreateDatabase("MySql");
MySql 部分指的是 app.config 中以下行的名称
<add name="MySql" connectionString="Data Source=YourServerName;
Database=YourDataBase;User ID=YourUserID;Password=YourPassword;"
providerName="MySql.Data.MySqlClient" />
历史
- V1.0 首次发布