annotate Source/Data/Sql/SqlDataType.cs @ 0:f990fcb411a9

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