|
|||||||||||||||||||||||
|
|||||||||||||||||||||||
|
Announcements
Chapters
Services
Feature Zones
|
Note: This is an unedited contribution. If this article is inappropriate,
needs attention or copies someone else's work without reference then please
Report This Article
IntroductionIntroductionI have been looking at Microsoft's Enterprise Library for .NET Framework 2.0[^] and I wondered how difficult it would be to extend the Data Access Application Block to include MySQL as one of the databases. Standing on the Shoulders...I found Benjamin Mayrargue's article: MySQL connector for Microsoft Enterprise Library (January 2005 version). I followed the steps he took, just to see if I could get it to work. AssumptionsI have made a few assumptions; BackgroundMicrosoft's Enterprise Library for .NET Framework 2.0 is a framework to base your code around, its flexible and extendable. The Data Access Block proves a database independant implementation layer for you to add into your code, although its database independant, there are only two existing providers supplied with the data access block, SQL Server and Oracle. This article shows you how to add MySql to this list, infact using the ideas from the article it should be possible to implement any .Net database connector as a Data Access Block (well thats the idea...But actually doing it might be quite tricky) Before we start...Just a quick warning before we start, this code works for me and my uses; connecting to MySql and running simple stored procedures (passing in parameters). I've not done a huge amount of work testing all the features of the MySql Data block work.... To be honest, they dont!! The more observant of you may notice there are some references to the mssql objects in the MySQL class - I'll get around to fixing it sometime or someone else might do it for me!! :-)Getting down and dirty...We have to go through a number of steps, they involve adding a couple of new classes (MySql Data Blocks) and some modifications to the Data Blocks themselves (which I have supplied in the source zip file). From looking through the code, I dont think I needed to do this, but the intergration is much tighter.Good luck!! Start hacking1) Create a sub-folder called 'MySql' in the directory contain the Data Access block source, for me its; C:\Program Files\Microsoft Enterprise Library January 2006\Src\Data\Download the source, and copy them into the 'mysql' folder. 2) Add a reference to the MySQL.Data Dll in references. 3) Time to hack the Data Access block. In the method (in the file DatabaseConfigurationView.cs) private DbProviderMapping GetDefaultMapping(string name, string dbProviderName) add the following code if (DbProviderMapping.DefaultMySqlProviderName.Equals(dbProviderName)) return defaultMySqlMapping; It should be obvious where it goes. 4) In the file DatabaseConfigurationView.cs add the following line.
private static readonly DbProviderMapping defaultMySqlMapping = new DbProviderMapping(DbProviderMapping.DefaultMySqlProviderName, typeof(MySqlDatabase));
private IConfigurationSource configurationSource;
So the top of the file reads; 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; 5) In DbProviderMappings.cs add the following xml/code
/// <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>
Its quite clere where to add it, its at the top of the file, just under the namespace declaration (with the rest of the XML) 6) Paste this code
/// <summary>
/// Default name for the MySQL managed provider.
/// </summary>
public const string DefaultMySqlProviderName = "MySql.Data.MySqlClient";
under the public const string DefaultOracleProviderName = "System.Data.OracleClient"; line. 7) You will have to add a using MySql.Data.MySqlClient; to DatabaseConfigurationView.cs and DbProviderMappings.cs to get it to compile.Bob's your UncleWell almost, I've tested normal SQL statments, they work, and stored procs work too. Well in the limited way I've tested them. Now you give it a go...I've create a simple demo project to go with the code. Have fun and let me know how you get on! I've not supplied any SQL code (hopefully you should be able to get it working with your own!) Points of InterestAs well as the MySql classes, I've included the two from the Data Access Block that I changed, so you dont have to do the typing yourselves. :-)I found using the Application Blocks very easy, much easier than I expected, so go on, give it a try. I've been doing some playing since I wrote this, and I've had some issues with MySql .NET provider having not being (fully) CLS-compliant [MySqlDbType]. Klaus Frederiksen has already answered this on the MySql Forums. The Test AppIn the test app, the first line which sets up the database connection is Database db = DatabaseFactory.CreateDatabase("MySql"); The MySql bit refers to name in the following line in the app.config <add name="MySql" connectionString="Data Source=YourServerName;Database=YourDataBase;User ID=YourUserID;Password=YourPassword;" providerName="MySql.Data.MySqlClient" /> HistoryV1.0 First Release
|
||||||||||||||||||||||