Mercurial > pub > bltoolkit
comparison Source/Data/DataProvider/MySqlDataProvider.cs @ 0:f990fcb411a9
Копия текущей версии из github
| author | cin | 
|---|---|
| date | Thu, 27 Mar 2014 21:46:09 +0400 | 
| parents | |
| children | 
   comparison
  equal
  deleted
  inserted
  replaced
| -1:000000000000 | 0:f990fcb411a9 | 
|---|---|
| 1 // MySql Connector/Net | |
| 2 // http://dev.mysql.com/downloads/connector/net/ | |
| 3 // | |
| 4 using System; | |
| 5 using System.Collections.Generic; | |
| 6 using System.Data; | |
| 7 using System.Data.Common; | |
| 8 | |
| 9 using MySql.Data.MySqlClient; | |
| 10 | |
| 11 namespace BLToolkit.Data.DataProvider | |
| 12 { | |
| 13 using Sql.SqlProvider; | |
| 14 using Common; | |
| 15 | |
| 16 public class MySqlDataProvider : DataProviderBase | |
| 17 { | |
| 18 #region Static configuration | |
| 19 | |
| 20 public static char ParameterSymbol | |
| 21 { | |
| 22 get { return MySqlSqlProvider.ParameterSymbol; } | |
| 23 set { MySqlSqlProvider.ParameterSymbol = value; } | |
| 24 } | |
| 25 | |
| 26 public static bool TryConvertParameterSymbol | |
| 27 { | |
| 28 get { return MySqlSqlProvider.TryConvertParameterSymbol; } | |
| 29 set { MySqlSqlProvider.TryConvertParameterSymbol = value; } | |
| 30 } | |
| 31 | |
| 32 public static string CommandParameterPrefix | |
| 33 { | |
| 34 get { return MySqlSqlProvider.CommandParameterPrefix; } | |
| 35 set { MySqlSqlProvider.CommandParameterPrefix = value; } | |
| 36 } | |
| 37 | |
| 38 public static string SprocParameterPrefix | |
| 39 { | |
| 40 get { return MySqlSqlProvider.SprocParameterPrefix; } | |
| 41 set { MySqlSqlProvider.SprocParameterPrefix = value; } | |
| 42 } | |
| 43 | |
| 44 public static List<char> ConvertParameterSymbols | |
| 45 { | |
| 46 get { return MySqlSqlProvider.ConvertParameterSymbols; } | |
| 47 set { MySqlSqlProvider.ConvertParameterSymbols = value; } | |
| 48 } | |
| 49 | |
| 50 [Obsolete("Use CommandParameterPrefix or SprocParameterPrefix instead.")] | |
| 51 public static string ParameterPrefix | |
| 52 { | |
| 53 get { return MySqlSqlProvider.SprocParameterPrefix; } | |
| 54 set { SprocParameterPrefix = CommandParameterPrefix = string.IsNullOrEmpty(value) ? string.Empty : value; } | |
| 55 } | |
| 56 | |
| 57 public static void ConfigureOldStyle() | |
| 58 { | |
| 59 ParameterSymbol = '?'; | |
| 60 ConvertParameterSymbols = new List<char>(new[] { '@' }); | |
| 61 TryConvertParameterSymbol = true; | |
| 62 } | |
| 63 | |
| 64 public static void ConfigureNewStyle() | |
| 65 { | |
| 66 ParameterSymbol = '@'; | |
| 67 ConvertParameterSymbols = null; | |
| 68 TryConvertParameterSymbol = false; | |
| 69 } | |
| 70 | |
| 71 static MySqlDataProvider() | |
| 72 { | |
| 73 ConfigureOldStyle(); | |
| 74 } | |
| 75 | |
| 76 #endregion | |
| 77 | |
| 78 public override IDbConnection CreateConnectionObject() | |
| 79 { | |
| 80 return new MySqlConnection(); | |
| 81 } | |
| 82 | |
| 83 public override DbDataAdapter CreateDataAdapterObject() | |
| 84 { | |
| 85 return new MySqlDataAdapter(); | |
| 86 } | |
| 87 | |
| 88 private void ConvertParameterNames(IDbCommand command) | |
| 89 { | |
| 90 foreach (IDataParameter p in command.Parameters) | |
| 91 { | |
| 92 if (p.ParameterName[0] != ParameterSymbol) | |
| 93 p.ParameterName = | |
| 94 Convert( | |
| 95 Convert(p.ParameterName, ConvertType.SprocParameterToName), | |
| 96 command.CommandType == CommandType.StoredProcedure ? ConvertType.NameToSprocParameter : ConvertType.NameToCommandParameter).ToString(); | |
| 97 } | |
| 98 } | |
| 99 | |
| 100 public override bool DeriveParameters(IDbCommand command) | |
| 101 { | |
| 102 if (command is MySqlCommand) | |
| 103 { | |
| 104 MySqlCommandBuilder.DeriveParameters((MySqlCommand)command); | |
| 105 | |
| 106 if (TryConvertParameterSymbol && ConvertParameterSymbols.Count > 0) | |
| 107 ConvertParameterNames(command); | |
| 108 | |
| 109 return true; | |
| 110 } | |
| 111 | |
| 112 return false; | |
| 113 } | |
| 114 | |
| 115 public override IDbDataParameter GetParameter( | |
| 116 IDbCommand command, | |
| 117 NameOrIndexParameter nameOrIndex) | |
| 118 { | |
| 119 if (nameOrIndex.ByName) | |
| 120 { | |
| 121 // if we have a stored procedure, then maybe command paramaters were formatted | |
| 122 // (SprocParameterPrefix added). In this case we need to format given parameter name first | |
| 123 // and only then try to take parameter by formatted parameter name | |
| 124 var parameterName = command.CommandType == CommandType.StoredProcedure | |
| 125 ? Convert(nameOrIndex.Name, ConvertType.NameToSprocParameter).ToString() | |
| 126 : nameOrIndex.Name; | |
| 127 | |
| 128 return (IDbDataParameter)(command.Parameters[parameterName]); | |
| 129 } | |
| 130 return (IDbDataParameter)(command.Parameters[nameOrIndex.Index]); | |
| 131 } | |
| 132 | |
| 133 public override object Convert(object value, ConvertType convertType) | |
| 134 { | |
| 135 if (value == null) | |
| 136 throw new ArgumentNullException("value"); | |
| 137 | |
| 138 switch (convertType) | |
| 139 { | |
| 140 case ConvertType.ExceptionToErrorNumber: | |
| 141 if (value is MySqlException) | |
| 142 return ((MySqlException)value).Number; | |
| 143 break; | |
| 144 | |
| 145 case ConvertType.ExceptionToErrorMessage: | |
| 146 if (value is MySqlException) | |
| 147 return ((MySqlException)value).Message; | |
| 148 break; | |
| 149 } | |
| 150 | |
| 151 return SqlProvider.Convert(value, convertType); | |
| 152 } | |
| 153 | |
| 154 public override DataExceptionType ConvertErrorNumberToDataExceptionType(int number) | |
| 155 { | |
| 156 switch (number) | |
| 157 { | |
| 158 case 1213: return DataExceptionType.Deadlock; | |
| 159 case 1205: return DataExceptionType.Timeout; | |
| 160 case 1216: | |
| 161 case 1217: return DataExceptionType.ForeignKeyViolation; | |
| 162 case 1169: return DataExceptionType.UniqueIndexViolation; | |
| 163 } | |
| 164 | |
| 165 return DataExceptionType.Undefined; | |
| 166 } | |
| 167 | |
| 168 public override Type ConnectionType | |
| 169 { | |
| 170 get { return typeof(MySqlConnection); } | |
| 171 } | |
| 172 | |
| 173 public override string Name | |
| 174 { | |
| 175 get { return DataProvider.ProviderName.MySql; } | |
| 176 } | |
| 177 | |
| 178 public override ISqlProvider CreateSqlProvider() | |
| 179 { | |
| 180 return new MySqlSqlProvider(); | |
| 181 } | |
| 182 | |
| 183 public override void Configure(System.Collections.Specialized.NameValueCollection attributes) | |
| 184 { | |
| 185 var paremeterPrefix = attributes["ParameterPrefix"]; | |
| 186 if (paremeterPrefix != null) | |
| 187 CommandParameterPrefix = SprocParameterPrefix = paremeterPrefix; | |
| 188 | |
| 189 paremeterPrefix = attributes["CommandParameterPrefix"]; | |
| 190 if (paremeterPrefix != null) | |
| 191 CommandParameterPrefix = paremeterPrefix; | |
| 192 | |
| 193 paremeterPrefix = attributes["SprocParameterPrefix"]; | |
| 194 if (paremeterPrefix != null) | |
| 195 SprocParameterPrefix = paremeterPrefix; | |
| 196 | |
| 197 var configName = attributes["ParameterSymbolConfig"]; | |
| 198 if (configName != null) | |
| 199 { | |
| 200 switch (configName) | |
| 201 { | |
| 202 case "OldStyle": | |
| 203 ConfigureOldStyle(); | |
| 204 break; | |
| 205 case "NewStyle": | |
| 206 ConfigureNewStyle(); | |
| 207 break; | |
| 208 } | |
| 209 } | |
| 210 | |
| 211 var parameterSymbol = attributes["ParameterSymbol"]; | |
| 212 if (parameterSymbol != null && parameterSymbol.Length == 1) | |
| 213 ParameterSymbol = parameterSymbol[0]; | |
| 214 | |
| 215 var convertParameterSymbols = attributes["ConvertParameterSymbols"]; | |
| 216 if (convertParameterSymbols != null) | |
| 217 ConvertParameterSymbols = new List<char>(convertParameterSymbols.ToCharArray()); | |
| 218 | |
| 219 var tryConvertParameterSymbol = attributes["TryConvertParameterSymbol"]; | |
| 220 if (tryConvertParameterSymbol != null) | |
| 221 TryConvertParameterSymbol = BLToolkit.Common.Convert.ToBoolean(tryConvertParameterSymbol); | |
| 222 | |
| 223 base.Configure(attributes); | |
| 224 } | |
| 225 } | |
| 226 } | 
