Mercurial > pub > bltoolkit
diff Source/Data/DataProvider/MySqlDataProvider.cs @ 0:f990fcb411a9
Копия текущей версии из github
author | cin |
---|---|
date | Thu, 27 Mar 2014 21:46:09 +0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Source/Data/DataProvider/MySqlDataProvider.cs Thu Mar 27 21:46:09 2014 +0400 @@ -0,0 +1,226 @@ +// 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; + using Common; + + public class MySqlDataProvider : DataProviderBase + { + #region Static configuration + + public static char ParameterSymbol + { + get { return MySqlSqlProvider.ParameterSymbol; } + set { MySqlSqlProvider.ParameterSymbol = value; } + } + + public static bool TryConvertParameterSymbol + { + get { return MySqlSqlProvider.TryConvertParameterSymbol; } + set { MySqlSqlProvider.TryConvertParameterSymbol = value; } + } + + public static string CommandParameterPrefix + { + get { return MySqlSqlProvider.CommandParameterPrefix; } + set { MySqlSqlProvider.CommandParameterPrefix = value; } + } + + public static string SprocParameterPrefix + { + get { return MySqlSqlProvider.SprocParameterPrefix; } + set { MySqlSqlProvider.SprocParameterPrefix = value; } + } + + public static List<char> ConvertParameterSymbols + { + get { return MySqlSqlProvider.ConvertParameterSymbols; } + set { MySqlSqlProvider.ConvertParameterSymbols = value; } + } + + [Obsolete("Use CommandParameterPrefix or SprocParameterPrefix instead.")] + public static string ParameterPrefix + { + get { return MySqlSqlProvider.SprocParameterPrefix; } + set { SprocParameterPrefix = CommandParameterPrefix = string.IsNullOrEmpty(value) ? string.Empty : value; } + } + + public static void ConfigureOldStyle() + { + ParameterSymbol = '?'; + ConvertParameterSymbols = new List<char>(new[] { '@' }); + 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 IDbDataParameter GetParameter( + IDbCommand command, + NameOrIndexParameter nameOrIndex) + { + if (nameOrIndex.ByName) + { + // if we have a stored procedure, then maybe command paramaters were formatted + // (SprocParameterPrefix added). In this case we need to format given parameter name first + // and only then try to take parameter by formatted parameter name + var parameterName = command.CommandType == CommandType.StoredProcedure + ? Convert(nameOrIndex.Name, ConvertType.NameToSprocParameter).ToString() + : nameOrIndex.Name; + + return (IDbDataParameter)(command.Parameters[parameterName]); + } + return (IDbDataParameter)(command.Parameters[nameOrIndex.Index]); + } + + public override object Convert(object value, ConvertType convertType) + { + if (value == null) + throw new ArgumentNullException("value"); + + switch (convertType) + { + 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 SqlProvider.Convert(value, convertType); + } + + public override DataExceptionType ConvertErrorNumberToDataExceptionType(int number) + { + switch (number) + { + case 1213: return DataExceptionType.Deadlock; + case 1205: return DataExceptionType.Timeout; + case 1216: + case 1217: return DataExceptionType.ForeignKeyViolation; + case 1169: return DataExceptionType.UniqueIndexViolation; + } + + return DataExceptionType.Undefined; + } + + public override Type ConnectionType + { + get { return typeof(MySqlConnection); } + } + + public override string Name + { + get { return DataProvider.ProviderName.MySql; } + } + + public override ISqlProvider CreateSqlProvider() + { + return new MySqlSqlProvider(); + } + + public override void Configure(System.Collections.Specialized.NameValueCollection attributes) + { + var 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; + + var configName = attributes["ParameterSymbolConfig"]; + if (configName != null) + { + switch (configName) + { + case "OldStyle": + ConfigureOldStyle(); + break; + case "NewStyle": + ConfigureNewStyle(); + break; + } + } + + var parameterSymbol = attributes["ParameterSymbol"]; + if (parameterSymbol != null && parameterSymbol.Length == 1) + ParameterSymbol = parameterSymbol[0]; + + var convertParameterSymbols = attributes["ConvertParameterSymbols"]; + if (convertParameterSymbols != null) + ConvertParameterSymbols = new List<char>(convertParameterSymbols.ToCharArray()); + + var tryConvertParameterSymbol = attributes["TryConvertParameterSymbol"]; + if (tryConvertParameterSymbol != null) + TryConvertParameterSymbol = BLToolkit.Common.Convert.ToBoolean(tryConvertParameterSymbol); + + base.Configure(attributes); + } + } +}