65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.73/5 (12投票s)

2006年9月13日

CPOL

4分钟阅读

viewsIcon

129340

downloadIcon

2545

一篇关于为 .NET Framework 2.0 的 Enterprise Library 添加 MySQL 连接器的文章

Sample Image - mysql.gif

引言

我一直在研究 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 文件中)。从代码来看,我认为我不需要这样做,但这样集成会更紧密。

祝您好运!!

开始修改

  1. 在包含数据访问块源的目录中创建一个名为“MySql”的子文件夹,对我来说,它位于 C:\Program Files\Microsoft Enterprise Library January 2006\Src\Data\
    下载源文件,并将它们复制到“mysql”文件夹中。
  2. 在引用中添加对 MySQL.Data DLL 的引用。
  3. 是时候修改数据访问块了。
    在方法中(在文件 DatabaseConfigurationView.cs 中)
  4. private DbProviderMapping GetDefaultMapping(string name, string dbProviderName)

    添加以下代码

    if (DbProviderMapping.DefaultMySqlProviderName.Equals(dbProviderName))    
                return defaultMySqlMapping;

    应该很清楚它应该放在哪里。

  5. 在文件 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;
  6. 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 在一起)。

  7. 粘贴此代码
    /// <summary>
    /// Default name for the MySQL managed provider.
    /// </summary>
    public const string DefaultMySqlProviderName = "MySql.Data.MySqlClient";

    在以下行下方

    public const string DefaultOracleProviderName = "System.Data.OracleClient";
  8. 你必须为 DatabaseConfigurationView.csDbProviderMappings.cs 添加一个 using MySql.Data.MySqlClient; 才能编译。

大功告成

嗯,差不多了,我测试了普通的 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 首次发布
© . All rights reserved.