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