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 } |