Business Logic Toolkit for .NET
www.bltoolkit.net
|  Home   |  Download   |  Documentation   |  Discussions   |  License   |

  Source.Data.DataProvider.MySqlDataProvider.cs

 
// MySql Connector/Net
// http://dev.mysql.com/downloads/connector/net/
//
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;

using MySql.Data.MySqlClient;

namespace BLToolkit.Data.DataProvider
{
    using Sql.SqlProvider;

    public class MySqlDataProvider :  DataProviderBase
    {
        #region Static configuration

        public static char ParameterSymbol           { get; set; }
        public static bool TryConvertParameterSymbol { get; set; }

        private static List<char> _convertParameterSymbols;
        public  static List<char>  ConvertParameterSymbols
        {
            get { return _convertParameterSymbols; }
            set { _convertParameterSymbols = value ?? new List<char>(); }
        }

        [Obsolete("Use CommandParameterPrefix or SprocParameterPrefix instead.")]
        public  static string  ParameterPrefix
        {
            get { return _sprocParameterPrefix; }
            set { _sprocParameterPrefix = _commandParameterPrefix = string.IsNullOrEmpty(value) ? string.Empty : value; }
        }

        private static string _commandParameterPrefix = "";
        public  static string  CommandParameterPrefix
        {
            get { return _commandParameterPrefix; }
            set { _commandParameterPrefix = string.IsNullOrEmpty(value) ? string.Empty : value; }
        }

        private static string _sprocParameterPrefix = "";
        public  static string  SprocParameterPrefix
        {
            get { return _sprocParameterPrefix; }
            set { _sprocParameterPrefix = string.IsNullOrEmpty(value) ? string.Empty : value; }
        }

        public static void ConfigureOldStyle()
        {
            ParameterSymbol           = '?';
            ConvertParameterSymbols   = new List<char>(new char[] { '@' });
            TryConvertParameterSymbol = true;
        }

        public static void ConfigureNewStyle()
        {
            ParameterSymbol           = '@';
            ConvertParameterSymbols   = null;
            TryConvertParameterSymbol = false;
        }

        static MySqlDataProvider()
        {
            ConfigureOldStyle();
        }
        
        #endregion

        public override IDbConnection CreateConnectionObject()
        {
            return new MySqlConnection();
        }

        public override DbDataAdapter CreateDataAdapterObject()
        {
            return new MySqlDataAdapter();
        }

        private void ConvertParameterNames(IDbCommand command)
        {
            foreach (IDataParameter p in command.Parameters)
            {
                if (p.ParameterName[0] != ParameterSymbol)
                    p.ParameterName =
                        Convert(
                            Convert(p.ParameterName, ConvertType.SprocParameterToName),
                            command.CommandType == CommandType.StoredProcedure ? ConvertType.NameToSprocParameter : ConvertType.NameToCommandParameter).ToString();
            }
        }

        public override bool DeriveParameters(IDbCommand command)
        {
            if (command is MySqlCommand)
            {
                MySqlCommandBuilder.DeriveParameters((MySqlCommand)command);

                if (TryConvertParameterSymbol && ConvertParameterSymbols.Count > 0)
                    ConvertParameterNames(command);

                return true;
            }

            return false;
        }

        public override object Convert(object value, ConvertType convertType)
        {
            switch (convertType)
            {
                case ConvertType.NameToQueryParameter:
                    return ParameterSymbol + value.ToString();

                case ConvertType.NameToCommandParameter:
                    return ParameterSymbol + CommandParameterPrefix + value.ToString();

                case ConvertType.NameToSprocParameter:
                    return ParameterSymbol + SprocParameterPrefix + value.ToString();

                case ConvertType.SprocParameterToName:
                    if (value != null)
                    {
                        string str = value.ToString();
                        str = (str.Length > 0 && (str[0] == ParameterSymbol || (TryConvertParameterSymbol && ConvertParameterSymbols.Contains(str[0])))) ? str.Substring(1) : str;

                        if ((!string.IsNullOrEmpty(SprocParameterPrefix))
                            && str.StartsWith(SprocParameterPrefix))
                            str = str.Substring(SprocParameterPrefix.Length);

                        return str;
                    }
                    break;

                case ConvertType.ExceptionToErrorNumber:
                    if (value is MySqlException)
                        return ((MySqlException)value).Number;
                    break;

                case ConvertType.ExceptionToErrorMessage:
                    if (value is MySqlException)
                        return ((MySqlException)value).Message;
                    break;
            }

            return value;
        }

        public override Type ConnectionType
        {
            get { return typeof(MySqlConnection); }
        }

        public override string Name
        {
            get { return DataProvider.ProviderName.MySql; }
        }

        public override ISqlProvider CreateSqlProvider()
        {
            return new MySqlSqlProvider(this);
        }

        public override void Configure(System.Collections.Specialized.NameValueCollection attributes)
        {
            string paremeterPrefix = attributes["ParameterPrefix"];
            if (paremeterPrefix != null)
                CommandParameterPrefix = SprocParameterPrefix = paremeterPrefix;

            paremeterPrefix = attributes["CommandParameterPrefix"];
            if (paremeterPrefix != null)
                CommandParameterPrefix = paremeterPrefix;

            paremeterPrefix = attributes["SprocParameterPrefix"];
            if (paremeterPrefix != null)
                SprocParameterPrefix = paremeterPrefix;

            string configName = attributes["ParameterSymbolConfig"];
            if (configName != null)
            {
                switch (configName)
                {
                    case "OldStyle":
                        ConfigureOldStyle();
                        break;
                    case "NewStyle":
                        ConfigureNewStyle();
                        break;
                }
            }

            string parameterSymbol = attributes["ParameterSymbol"];
            if (parameterSymbol != null && parameterSymbol.Length == 1)
                ParameterSymbol = parameterSymbol[0];

            string convertParameterSymbols = attributes["ConvertParameterSymbols"];
            if (convertParameterSymbols != null)
                ConvertParameterSymbols = new List<char>(convertParameterSymbols.ToCharArray());

            string tryConvertParameterSymbol = attributes["TryConvertParameterSymbol"];
            if (tryConvertParameterSymbol != null)
                TryConvertParameterSymbol = BLToolkit.Common.Convert.ToBoolean(tryConvertParameterSymbol);

            base.Configure(attributes);
        }
    }
}
 
© 2010 www.bltoolkit.net
support@bltoolkit.net