Mercurial > pub > bltoolkit
comparison Source/Data/Sql/SqlDataType.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 using System; | |
2 using System.Collections.Generic; | |
3 using System.Data; | |
4 using System.Data.SqlTypes; | |
5 using System.Linq; | |
6 using System.Text; | |
7 | |
8 namespace BLToolkit.Data.Sql | |
9 { | |
10 using Reflection; | |
11 | |
12 public class SqlDataType : ISqlExpression | |
13 { | |
14 #region Init | |
15 | |
16 public SqlDataType(SqlDbType dbType) | |
17 { | |
18 var defaultType = GetDataType(dbType); | |
19 | |
20 SqlDbType = dbType; | |
21 Type = defaultType.Type; | |
22 Length = defaultType.Length; | |
23 Precision = defaultType.Precision; | |
24 Scale = defaultType.Scale; | |
25 } | |
26 | |
27 public SqlDataType(SqlDbType dbType, int length) | |
28 { | |
29 if (length <= 0) throw new ArgumentOutOfRangeException("length"); | |
30 | |
31 SqlDbType = dbType; | |
32 Type = GetDataType(dbType).Type; | |
33 Length = length; | |
34 } | |
35 | |
36 public SqlDataType(SqlDbType dbType, int precision, int scale) | |
37 { | |
38 if (precision <= 0) throw new ArgumentOutOfRangeException("precision"); | |
39 if (scale < 0) throw new ArgumentOutOfRangeException("scale"); | |
40 | |
41 SqlDbType = dbType; | |
42 Type = GetDataType(dbType).Type; | |
43 Precision = precision; | |
44 Scale = scale; | |
45 } | |
46 | |
47 public SqlDataType([JetBrains.Annotations.NotNull]Type type) | |
48 { | |
49 if (type == null) throw new ArgumentNullException("type"); | |
50 | |
51 var defaultType = GetDataType(type); | |
52 | |
53 SqlDbType = defaultType.SqlDbType; | |
54 Type = type; | |
55 Length = defaultType.Length; | |
56 Precision = defaultType.Precision; | |
57 Scale = defaultType.Scale; | |
58 } | |
59 | |
60 public SqlDataType([JetBrains.Annotations.NotNull] Type type, int length) | |
61 { | |
62 if (type == null) throw new ArgumentNullException ("type"); | |
63 if (length <= 0) throw new ArgumentOutOfRangeException("length"); | |
64 | |
65 SqlDbType = GetDataType(type).SqlDbType; | |
66 Type = type; | |
67 Length = length; | |
68 } | |
69 | |
70 public SqlDataType([JetBrains.Annotations.NotNull] Type type, int precision, int scale) | |
71 { | |
72 if (type == null) throw new ArgumentNullException ("type"); | |
73 if (precision <= 0) throw new ArgumentOutOfRangeException("precision"); | |
74 if (scale < 0) throw new ArgumentOutOfRangeException("scale"); | |
75 | |
76 SqlDbType = GetDataType(type).SqlDbType; | |
77 Type = type; | |
78 Precision = precision; | |
79 Scale = scale; | |
80 } | |
81 | |
82 public SqlDataType(SqlDbType dbType, [JetBrains.Annotations.NotNull]Type type) | |
83 { | |
84 if (type == null) throw new ArgumentNullException("type"); | |
85 | |
86 var defaultType = GetDataType(dbType); | |
87 | |
88 SqlDbType = dbType; | |
89 Type = type; | |
90 Length = defaultType.Length; | |
91 Precision = defaultType.Precision; | |
92 Scale = defaultType.Scale; | |
93 } | |
94 | |
95 public SqlDataType(SqlDbType dbType, [JetBrains.Annotations.NotNull] Type type, int length) | |
96 { | |
97 if (type == null) throw new ArgumentNullException ("type"); | |
98 if (length <= 0) throw new ArgumentOutOfRangeException("length"); | |
99 | |
100 SqlDbType = dbType; | |
101 Type = type; | |
102 Length = length; | |
103 } | |
104 | |
105 public SqlDataType(SqlDbType dbType, [JetBrains.Annotations.NotNull] Type type, int precision, int scale) | |
106 { | |
107 if (type == null) throw new ArgumentNullException ("type"); | |
108 if (precision <= 0) throw new ArgumentOutOfRangeException("precision"); | |
109 if (scale < 0) throw new ArgumentOutOfRangeException("scale"); | |
110 | |
111 SqlDbType = dbType; | |
112 Type = type; | |
113 Precision = precision; | |
114 Scale = scale; | |
115 } | |
116 | |
117 #endregion | |
118 | |
119 #region Public Members | |
120 | |
121 public SqlDbType SqlDbType { get; private set; } | |
122 public Type Type { get; private set; } | |
123 public int Length { get; private set; } | |
124 public int Precision { get; private set; } | |
125 public int Scale { get; private set; } | |
126 | |
127 #endregion | |
128 | |
129 #region Static Members | |
130 | |
131 struct TypeInfo | |
132 { | |
133 public TypeInfo(SqlDbType dbType, int maxLength, int maxPrecision, int maxScale, int maxDisplaySize) | |
134 { | |
135 SqlDbType = dbType; | |
136 MaxLength = maxLength; | |
137 MaxPrecision = maxPrecision; | |
138 MaxScale = maxScale; | |
139 MaxDisplaySize = maxDisplaySize; | |
140 } | |
141 | |
142 public readonly SqlDbType SqlDbType; | |
143 public readonly int MaxLength; | |
144 public readonly int MaxPrecision; | |
145 public readonly int MaxScale; | |
146 public readonly int MaxDisplaySize; | |
147 } | |
148 | |
149 static TypeInfo[] SortTypeInfo(params TypeInfo[] info) | |
150 { | |
151 var sortedInfo = new TypeInfo[info.Max(ti => (int)ti.SqlDbType) + 1]; | |
152 | |
153 foreach (var typeInfo in info) | |
154 sortedInfo[(int)typeInfo.SqlDbType] = typeInfo; | |
155 | |
156 return sortedInfo; | |
157 } | |
158 | |
159 static int Len(object obj) | |
160 { | |
161 return obj.ToString().Length; | |
162 } | |
163 | |
164 static readonly TypeInfo[] _typeInfo = SortTypeInfo | |
165 ( | |
166 // DbType MaxLength MaxPrecision MaxScale MaxDisplaySize | |
167 // | |
168 new TypeInfo(SqlDbType.BigInt, 8, Len( long.MaxValue), 0, Len( long.MinValue)), | |
169 new TypeInfo(SqlDbType.Int, 4, Len( int.MaxValue), 0, Len( int.MinValue)), | |
170 new TypeInfo(SqlDbType.SmallInt, 2, Len(short.MaxValue), 0, Len(short.MinValue)), | |
171 new TypeInfo(SqlDbType.TinyInt, 1, Len( byte.MaxValue), 0, Len( byte.MaxValue)), | |
172 new TypeInfo(SqlDbType.Bit, 1, 1, 0, 1), | |
173 | |
174 new TypeInfo(SqlDbType.Decimal, 17, Len(decimal.MaxValue), Len(decimal.MaxValue), Len(decimal.MinValue)+1), | |
175 new TypeInfo(SqlDbType.Money, 8, 19, 4, 19 + 2), | |
176 new TypeInfo(SqlDbType.SmallMoney, 4, 10, 4, 10 + 2), | |
177 new TypeInfo(SqlDbType.Float, 8, 15, 15, 15 + 2 + 5), | |
178 new TypeInfo(SqlDbType.Real, 4, 7, 7, 7 + 2 + 4), | |
179 | |
180 new TypeInfo(SqlDbType.DateTime, 8, -1, -1, 23), | |
181 #if !MONO | |
182 new TypeInfo(SqlDbType.DateTime2, 8, -1, -1, 27), | |
183 #endif | |
184 new TypeInfo(SqlDbType.SmallDateTime, 4, -1, -1, 19), | |
185 new TypeInfo(SqlDbType.Date, 3, -1, -1, 10), | |
186 new TypeInfo(SqlDbType.Time, 5, -1, -1, 16), | |
187 #if !MONO | |
188 new TypeInfo(SqlDbType.DateTimeOffset, 10, -1, -1, 34), | |
189 #endif | |
190 | |
191 new TypeInfo(SqlDbType.Char, 8000, -1, -1, 8000), | |
192 new TypeInfo(SqlDbType.VarChar, 8000, -1, -1, 8000), | |
193 new TypeInfo(SqlDbType.Text, int.MaxValue, -1, -1, int.MaxValue), | |
194 new TypeInfo(SqlDbType.NChar, 4000, -1, -1, 4000), | |
195 new TypeInfo(SqlDbType.NVarChar, 4000, -1, -1, 4000), | |
196 new TypeInfo(SqlDbType.NText, int.MaxValue, -1, -1, int.MaxValue / 2), | |
197 | |
198 new TypeInfo(SqlDbType.Binary, 8000, -1, -1, -1), | |
199 new TypeInfo(SqlDbType.VarBinary, 8000, -1, -1, -1), | |
200 new TypeInfo(SqlDbType.Image, int.MaxValue, -1, -1, -1), | |
201 | |
202 new TypeInfo(SqlDbType.Timestamp, 8, -1, -1, -1), | |
203 new TypeInfo(SqlDbType.UniqueIdentifier, 16, -1, -1, 36), | |
204 | |
205 new TypeInfo(SqlDbType.Variant, -1, -1, -1, -1), | |
206 new TypeInfo(SqlDbType.Xml, -1, -1, -1, -1), | |
207 #if !MONO | |
208 new TypeInfo(SqlDbType.Structured, -1, -1, -1, -1), | |
209 #endif | |
210 new TypeInfo(SqlDbType.Udt, -1, -1, -1, -1) | |
211 ); | |
212 | |
213 public static int GetMaxLength (SqlDbType dbType) { return _typeInfo[(int)dbType].MaxLength; } | |
214 public static int GetMaxPrecision (SqlDbType dbType) { return _typeInfo[(int)dbType].MaxPrecision; } | |
215 public static int GetMaxScale (SqlDbType dbType) { return _typeInfo[(int)dbType].MaxScale; } | |
216 public static int GetMaxDisplaySize(SqlDbType dbType) { return _typeInfo[(int)dbType].MaxDisplaySize; } | |
217 | |
218 public static SqlDataType GetDataType(Type type) | |
219 { | |
220 var underlyingType = type; | |
221 | |
222 if (underlyingType.IsGenericType && underlyingType.GetGenericTypeDefinition() == typeof(Nullable<>)) | |
223 underlyingType = underlyingType.GetGenericArguments()[0]; | |
224 | |
225 if (underlyingType.IsEnum) | |
226 underlyingType = Enum.GetUnderlyingType(underlyingType); | |
227 | |
228 switch (Type.GetTypeCode(underlyingType)) | |
229 { | |
230 case TypeCode.Boolean : return Boolean; | |
231 case TypeCode.Char : return Char; | |
232 case TypeCode.SByte : return SByte; | |
233 case TypeCode.Byte : return Byte; | |
234 case TypeCode.Int16 : return Int16; | |
235 case TypeCode.UInt16 : return UInt16; | |
236 case TypeCode.Int32 : return Int32; | |
237 case TypeCode.UInt32 : return UInt32; | |
238 case TypeCode.Int64 : return Int64; | |
239 case TypeCode.UInt64 : return UInt64; | |
240 case TypeCode.Single : return Single; | |
241 case TypeCode.Double : return Double; | |
242 case TypeCode.Decimal : return Decimal; | |
243 case TypeCode.DateTime : return DateTime; | |
244 case TypeCode.String : return String; | |
245 case TypeCode.Object : | |
246 if (underlyingType == typeof(Guid)) return Guid; | |
247 if (underlyingType == typeof(byte[])) return ByteArray; | |
248 if (underlyingType == typeof(System.Data.Linq.Binary)) return LinqBinary; | |
249 if (underlyingType == typeof(char[])) return CharArray; | |
250 #if !MONO | |
251 if (underlyingType == typeof(DateTimeOffset)) return DateTimeOffset; | |
252 #endif | |
253 if (underlyingType == typeof(TimeSpan)) return TimeSpan; | |
254 break; | |
255 | |
256 case TypeCode.DBNull : | |
257 case TypeCode.Empty : | |
258 default : break; | |
259 } | |
260 | |
261 #if !SILVERLIGHT | |
262 | |
263 if (underlyingType == typeof(SqlByte)) return SqlByte; | |
264 if (underlyingType == typeof(SqlInt16)) return SqlInt16; | |
265 if (underlyingType == typeof(SqlInt32)) return SqlInt32; | |
266 if (underlyingType == typeof(SqlInt64)) return SqlInt64; | |
267 if (underlyingType == typeof(SqlSingle)) return SqlSingle; | |
268 if (underlyingType == typeof(SqlBoolean)) return SqlBoolean; | |
269 if (underlyingType == typeof(SqlDouble)) return SqlDouble; | |
270 if (underlyingType == typeof(SqlDateTime)) return SqlDateTime; | |
271 if (underlyingType == typeof(SqlDecimal)) return SqlDecimal; | |
272 if (underlyingType == typeof(SqlMoney)) return SqlMoney; | |
273 if (underlyingType == typeof(SqlString)) return SqlString; | |
274 if (underlyingType == typeof(SqlBinary)) return SqlBinary; | |
275 if (underlyingType == typeof(SqlGuid)) return SqlGuid; | |
276 if (underlyingType == typeof(SqlBytes)) return SqlBytes; | |
277 if (underlyingType == typeof(SqlChars)) return SqlChars; | |
278 if (underlyingType == typeof(SqlXml)) return SqlXml; | |
279 | |
280 #endif | |
281 | |
282 return DbVariant; | |
283 } | |
284 | |
285 public static SqlDataType GetDataType(SqlDbType type) | |
286 { | |
287 switch (type) | |
288 { | |
289 case SqlDbType.BigInt : return DbBigInt; | |
290 case SqlDbType.Binary : return DbBinary; | |
291 case SqlDbType.Bit : return DbBit; | |
292 case SqlDbType.Char : return DbChar; | |
293 case SqlDbType.DateTime : return DbDateTime; | |
294 case SqlDbType.Decimal : return DbDecimal; | |
295 case SqlDbType.Float : return DbFloat; | |
296 case SqlDbType.Image : return DbImage; | |
297 case SqlDbType.Int : return DbInt; | |
298 case SqlDbType.Money : return DbMoney; | |
299 case SqlDbType.NChar : return DbNChar; | |
300 case SqlDbType.NText : return DbNText; | |
301 case SqlDbType.NVarChar : return DbNVarChar; | |
302 case SqlDbType.Real : return DbReal; | |
303 case SqlDbType.UniqueIdentifier : return DbUniqueIdentifier; | |
304 case SqlDbType.SmallDateTime : return DbSmallDateTime; | |
305 case SqlDbType.SmallInt : return DbSmallInt; | |
306 case SqlDbType.SmallMoney : return DbSmallMoney; | |
307 case SqlDbType.Text : return DbText; | |
308 case SqlDbType.Timestamp : return DbTimestamp; | |
309 case SqlDbType.TinyInt : return DbTinyInt; | |
310 case SqlDbType.VarBinary : return DbVarBinary; | |
311 case SqlDbType.VarChar : return DbVarChar; | |
312 case SqlDbType.Variant : return DbVariant; | |
313 #if !SILVERLIGHT | |
314 case SqlDbType.Xml : return DbXml; | |
315 #endif | |
316 case SqlDbType.Udt : return DbUdt; | |
317 #if !MONO | |
318 case SqlDbType.Structured : return DbStructured; | |
319 #endif | |
320 case SqlDbType.Date : return DbDate; | |
321 case SqlDbType.Time : return DbTime; | |
322 #if !MONO | |
323 case SqlDbType.DateTime2 : return DbDateTime2; | |
324 case SqlDbType.DateTimeOffset : return DbDateTimeOffset; | |
325 #endif | |
326 } | |
327 | |
328 throw new InvalidOperationException(); | |
329 } | |
330 | |
331 public static bool CanBeNull(Type type) | |
332 { | |
333 if (type.IsValueType == false || | |
334 type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>) || | |
335 TypeHelper.IsSameOrParent(typeof(INullable), type)) | |
336 return true; | |
337 | |
338 return false; | |
339 } | |
340 | |
341 #endregion | |
342 | |
343 #region Default Types | |
344 | |
345 internal SqlDataType(SqlDbType dbType, Type type, int length, int precision, int scale) | |
346 { | |
347 SqlDbType = dbType; | |
348 Type = type; | |
349 Length = length; | |
350 Precision = precision; | |
351 Scale = scale; | |
352 } | |
353 | |
354 SqlDataType(SqlDbType dbType, Type type, Func<SqlDbType,int> length, int precision, int scale) | |
355 : this(dbType, type, length(dbType), precision, scale) | |
356 { | |
357 } | |
358 | |
359 SqlDataType(SqlDbType dbType, Type type, int length, Func<SqlDbType,int> precision, int scale) | |
360 : this(dbType, type, length, precision(dbType), scale) | |
361 { | |
362 } | |
363 | |
364 public static readonly SqlDataType DbBigInt = new SqlDataType(SqlDbType.BigInt, typeof(Int64), 0, 0, 0); | |
365 public static readonly SqlDataType DbInt = new SqlDataType(SqlDbType.Int, typeof(Int32), 0, 0, 0); | |
366 public static readonly SqlDataType DbSmallInt = new SqlDataType(SqlDbType.SmallInt, typeof(Int16), 0, 0, 0); | |
367 public static readonly SqlDataType DbTinyInt = new SqlDataType(SqlDbType.TinyInt, typeof(Byte), 0, 0, 0); | |
368 public static readonly SqlDataType DbBit = new SqlDataType(SqlDbType.Bit, typeof(Boolean), 0, 0, 0); | |
369 | |
370 public static readonly SqlDataType DbDecimal = new SqlDataType(SqlDbType.Decimal, typeof(Decimal), 0, GetMaxPrecision, 10); | |
371 public static readonly SqlDataType DbMoney = new SqlDataType(SqlDbType.Money, typeof(Decimal), 0, GetMaxPrecision, 4); | |
372 public static readonly SqlDataType DbSmallMoney = new SqlDataType(SqlDbType.SmallMoney, typeof(Decimal), 0, GetMaxPrecision, 4); | |
373 public static readonly SqlDataType DbFloat = new SqlDataType(SqlDbType.Float, typeof(Double), 0, 0, 0); | |
374 public static readonly SqlDataType DbReal = new SqlDataType(SqlDbType.Real, typeof(Single), 0, 0, 0); | |
375 | |
376 public static readonly SqlDataType DbDateTime = new SqlDataType(SqlDbType.DateTime, typeof(DateTime), 0, 0, 0); | |
377 #if !MONO | |
378 public static readonly SqlDataType DbDateTime2 = new SqlDataType(SqlDbType.DateTime2, typeof(DateTime), 0, 0, 0); | |
379 #else | |
380 public static readonly SqlDataType DbDateTime2 = new SqlDataType(SqlDbType.DateTime, typeof(DateTime), 0, 0, 0); | |
381 #endif | |
382 public static readonly SqlDataType DbSmallDateTime = new SqlDataType(SqlDbType.SmallDateTime, typeof(DateTime), 0, 0, 0); | |
383 public static readonly SqlDataType DbDate = new SqlDataType(SqlDbType.Date, typeof(DateTime), 0, 0, 0); | |
384 public static readonly SqlDataType DbTime = new SqlDataType(SqlDbType.Time, typeof(TimeSpan), 0, 0, 0); | |
385 #if !MONO | |
386 public static readonly SqlDataType DbDateTimeOffset = new SqlDataType(SqlDbType.DateTimeOffset, typeof(DateTimeOffset), 0, 0, 0); | |
387 #endif | |
388 | |
389 public static readonly SqlDataType DbChar = new SqlDataType(SqlDbType.Char, typeof(String), GetMaxLength, 0, 0); | |
390 public static readonly SqlDataType DbVarChar = new SqlDataType(SqlDbType.VarChar, typeof(String), GetMaxLength, 0, 0); | |
391 public static readonly SqlDataType DbText = new SqlDataType(SqlDbType.Text, typeof(String), GetMaxLength, 0, 0); | |
392 public static readonly SqlDataType DbNChar = new SqlDataType(SqlDbType.NChar, typeof(String), GetMaxLength, 0, 0); | |
393 public static readonly SqlDataType DbNVarChar = new SqlDataType(SqlDbType.NVarChar, typeof(String), GetMaxLength, 0, 0); | |
394 public static readonly SqlDataType DbNText = new SqlDataType(SqlDbType.NText, typeof(String), GetMaxLength, 0, 0); | |
395 | |
396 public static readonly SqlDataType DbBinary = new SqlDataType(SqlDbType.Binary, typeof(Byte[]), GetMaxLength, 0, 0); | |
397 public static readonly SqlDataType DbVarBinary = new SqlDataType(SqlDbType.VarBinary, typeof(Byte[]), GetMaxLength, 0, 0); | |
398 public static readonly SqlDataType DbImage = new SqlDataType(SqlDbType.Image, typeof(Byte[]), GetMaxLength, 0, 0); | |
399 | |
400 public static readonly SqlDataType DbTimestamp = new SqlDataType(SqlDbType.Timestamp, typeof(Byte[]), 0, 0, 0); | |
401 public static readonly SqlDataType DbUniqueIdentifier = new SqlDataType(SqlDbType.UniqueIdentifier, typeof(Guid), 0, 0, 0); | |
402 | |
403 public static readonly SqlDataType DbVariant = new SqlDataType(SqlDbType.Variant, typeof(Object), 0, 0, 0); | |
404 #if !SILVERLIGHT | |
405 public static readonly SqlDataType DbXml = new SqlDataType(SqlDbType.Xml, typeof(SqlXml), 0, 0, 0); | |
406 #endif | |
407 public static readonly SqlDataType DbUdt = new SqlDataType(SqlDbType.Udt, typeof(Object), 0, 0, 0); | |
408 #if !MONO | |
409 public static readonly SqlDataType DbStructured = new SqlDataType(SqlDbType.Structured, typeof(Object), 0, 0, 0); | |
410 #endif | |
411 | |
412 public static readonly SqlDataType Boolean = DbBit; | |
413 public static readonly SqlDataType Char = new SqlDataType(SqlDbType.Char, typeof(Char), 1, 0, 0); | |
414 public static readonly SqlDataType SByte = new SqlDataType(SqlDbType.SmallInt, typeof(SByte), 0, 0, 0); | |
415 public static readonly SqlDataType Byte = DbTinyInt; | |
416 public static readonly SqlDataType Int16 = DbSmallInt; | |
417 public static readonly SqlDataType UInt16 = new SqlDataType(SqlDbType.Int, typeof(UInt16), 0, 0, 0); | |
418 public static readonly SqlDataType Int32 = DbInt; | |
419 public static readonly SqlDataType UInt32 = new SqlDataType(SqlDbType.BigInt, typeof(UInt32), 0, 0, 0); | |
420 public static readonly SqlDataType Int64 = DbBigInt; | |
421 public static readonly SqlDataType UInt64 = new SqlDataType(SqlDbType.Decimal, typeof(UInt64), 0, ulong.MaxValue.ToString().Length, 0); | |
422 public static readonly SqlDataType Single = DbReal; | |
423 public static readonly SqlDataType Double = DbFloat; | |
424 public static readonly SqlDataType Decimal = DbDecimal; | |
425 public static readonly SqlDataType DateTime = DbDateTime2; | |
426 public static readonly SqlDataType String = DbNVarChar; | |
427 public static readonly SqlDataType Guid = DbUniqueIdentifier; | |
428 public static readonly SqlDataType ByteArray = DbVarBinary; | |
429 public static readonly SqlDataType LinqBinary = DbVarBinary; | |
430 public static readonly SqlDataType CharArray = new SqlDataType(SqlDbType.NVarChar, typeof(Char[]), GetMaxLength, 0, 0); | |
431 #if !MONO | |
432 public static readonly SqlDataType DateTimeOffset = DbDateTimeOffset; | |
433 #endif | |
434 public static readonly SqlDataType TimeSpan = DbTime; | |
435 | |
436 #if !SILVERLIGHT | |
437 public static readonly SqlDataType SqlByte = new SqlDataType(SqlDbType.TinyInt, typeof(SqlByte), 0, 0, 0); | |
438 public static readonly SqlDataType SqlInt16 = new SqlDataType(SqlDbType.SmallInt, typeof(SqlInt16), 0, 0, 0); | |
439 public static readonly SqlDataType SqlInt32 = new SqlDataType(SqlDbType.Int, typeof(SqlInt32), 0, 0, 0); | |
440 public static readonly SqlDataType SqlInt64 = new SqlDataType(SqlDbType.BigInt, typeof(SqlInt64), 0, 0, 0); | |
441 public static readonly SqlDataType SqlSingle = new SqlDataType(SqlDbType.Real, typeof(SqlSingle), 0, 0, 0); | |
442 public static readonly SqlDataType SqlBoolean = new SqlDataType(SqlDbType.Bit, typeof(SqlBoolean), 0, 0, 0); | |
443 public static readonly SqlDataType SqlDouble = new SqlDataType(SqlDbType.Float, typeof(SqlDouble), 0, 0, 0); | |
444 public static readonly SqlDataType SqlDateTime = new SqlDataType(SqlDbType.DateTime, typeof(SqlDateTime), 0, 0, 0); | |
445 public static readonly SqlDataType SqlDecimal = new SqlDataType(SqlDbType.Decimal, typeof(SqlDecimal), 0, GetMaxPrecision, 10); | |
446 public static readonly SqlDataType SqlMoney = new SqlDataType(SqlDbType.Money, typeof(SqlMoney), 0, GetMaxPrecision, 4); | |
447 public static readonly SqlDataType SqlString = new SqlDataType(SqlDbType.NVarChar, typeof(SqlString), GetMaxLength, 0, 0); | |
448 public static readonly SqlDataType SqlBinary = new SqlDataType(SqlDbType.Binary, typeof(SqlBinary), GetMaxLength, 0, 0); | |
449 public static readonly SqlDataType SqlGuid = new SqlDataType(SqlDbType.UniqueIdentifier, typeof(SqlGuid), 0, 0, 0); | |
450 public static readonly SqlDataType SqlBytes = new SqlDataType(SqlDbType.Image, typeof(SqlBytes), GetMaxLength, 0, 0); | |
451 public static readonly SqlDataType SqlChars = new SqlDataType(SqlDbType.Text, typeof(SqlChars), GetMaxLength, 0, 0); | |
452 public static readonly SqlDataType SqlXml = new SqlDataType(SqlDbType.Xml, typeof(SqlXml), 0, 0, 0); | |
453 #endif | |
454 | |
455 #endregion | |
456 | |
457 #region Overrides | |
458 | |
459 #if OVERRIDETOSTRING | |
460 | |
461 public override string ToString() | |
462 { | |
463 return ((IQueryElement)this).ToString(new StringBuilder(), new Dictionary<IQueryElement,IQueryElement>()).ToString(); | |
464 } | |
465 | |
466 #endif | |
467 | |
468 #endregion | |
469 | |
470 #region ISqlExpression Members | |
471 | |
472 public int Precedence | |
473 { | |
474 get { return Sql.Precedence.Primary; } | |
475 } | |
476 | |
477 public Type SystemType | |
478 { | |
479 get { return typeof(Type); } | |
480 } | |
481 | |
482 #endregion | |
483 | |
484 #region ISqlExpressionWalkable Members | |
485 | |
486 ISqlExpression ISqlExpressionWalkable.Walk(bool skipColumns, Func<ISqlExpression,ISqlExpression> func) | |
487 { | |
488 return func(this); | |
489 } | |
490 | |
491 #endregion | |
492 | |
493 #region IEquatable<ISqlExpression> Members | |
494 | |
495 bool IEquatable<ISqlExpression>.Equals(ISqlExpression other) | |
496 { | |
497 if (this == other) | |
498 return true; | |
499 | |
500 var value = (SqlDataType)other; | |
501 return Type == value.Type && Length == value.Length && Precision == value.Precision && Scale == value.Scale; | |
502 } | |
503 | |
504 #endregion | |
505 | |
506 #region ISqlExpression Members | |
507 | |
508 public bool CanBeNull() | |
509 { | |
510 return false; | |
511 } | |
512 | |
513 public bool Equals(ISqlExpression other, Func<ISqlExpression,ISqlExpression,bool> comparer) | |
514 { | |
515 return ((ISqlExpression)this).Equals(other) && comparer(this, other); | |
516 } | |
517 | |
518 #endregion | |
519 | |
520 #region ICloneableElement Members | |
521 | |
522 public ICloneableElement Clone(Dictionary<ICloneableElement, ICloneableElement> objectTree, Predicate<ICloneableElement> doClone) | |
523 { | |
524 if (!doClone(this)) | |
525 return this; | |
526 | |
527 ICloneableElement clone; | |
528 | |
529 if (!objectTree.TryGetValue(this, out clone)) | |
530 objectTree.Add(this, clone = new SqlDataType(SqlDbType, Type, Length, Precision, Scale)); | |
531 | |
532 return clone; | |
533 } | |
534 | |
535 #endregion | |
536 | |
537 #region IQueryElement Members | |
538 | |
539 public QueryElementType ElementType { get { return QueryElementType.SqlDataType; } } | |
540 | |
541 StringBuilder IQueryElement.ToString(StringBuilder sb, Dictionary<IQueryElement,IQueryElement> dic) | |
542 { | |
543 sb.Append(SqlDbType); | |
544 | |
545 if (Length != 0) | |
546 sb.Append('(').Append(Length).Append(')'); | |
547 else if (Precision != 0) | |
548 sb.Append('(').Append(Precision).Append(',').Append(Scale).Append(')'); | |
549 | |
550 return sb; | |
551 } | |
552 | |
553 #endregion | |
554 } | |
555 } |