Mercurial > pub > bltoolkit
comparison Source/ServiceModel/ServiceModelDataReader.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.Globalization; | |
5 | |
6 namespace BLToolkit.ServiceModel | |
7 { | |
8 using Common; | |
9 | |
10 class ServiceModelDataReader : IDataReader | |
11 { | |
12 public ServiceModelDataReader(LinqServiceResult result) | |
13 { | |
14 _result = result; | |
15 | |
16 for (var i = 0; i < result.FieldNames.Length; i++) | |
17 _ordinal.Add(result.FieldNames[i], i); | |
18 } | |
19 | |
20 readonly LinqServiceResult _result; | |
21 readonly Dictionary<string,int> _ordinal = new Dictionary<string,int>(); | |
22 | |
23 string[] _data; | |
24 int _current = -1; | |
25 | |
26 #region IDataReader Members | |
27 | |
28 public void Close() | |
29 { | |
30 } | |
31 | |
32 public int Depth | |
33 { | |
34 get { return 0; } | |
35 } | |
36 | |
37 #if !SILVERLIGHT | |
38 | |
39 public DataTable GetSchemaTable() | |
40 { | |
41 throw new InvalidOperationException(); | |
42 } | |
43 | |
44 #endif | |
45 | |
46 public bool IsClosed | |
47 { | |
48 get { throw new InvalidOperationException(); } | |
49 } | |
50 | |
51 public bool NextResult() | |
52 { | |
53 throw new InvalidOperationException(); | |
54 } | |
55 | |
56 public bool Read() | |
57 { | |
58 if (++_current < _result.RowCount) | |
59 { | |
60 _data = _result.Data[_current]; | |
61 | |
62 return true; | |
63 } | |
64 | |
65 _data = null; | |
66 | |
67 return false; | |
68 } | |
69 | |
70 public int RecordsAffected | |
71 { | |
72 get { throw new InvalidOperationException(); } | |
73 } | |
74 | |
75 #endregion | |
76 | |
77 #region IDisposable Members | |
78 | |
79 public void Dispose() | |
80 { | |
81 } | |
82 | |
83 #endregion | |
84 | |
85 #region IDataRecord Members | |
86 | |
87 public int FieldCount | |
88 { | |
89 get { return _result.FieldCount; } | |
90 } | |
91 | |
92 public bool GetBoolean(int i) | |
93 { | |
94 return bool.Parse(_data[i]); | |
95 } | |
96 | |
97 public byte GetByte(int i) | |
98 { | |
99 return byte.Parse(_data[i]); | |
100 } | |
101 | |
102 public long GetBytes(int i, long fieldOffset, byte[] buffer, int bufferoffset, int length) | |
103 { | |
104 throw new InvalidOperationException(); | |
105 } | |
106 | |
107 public char GetChar(int i) | |
108 { | |
109 return _data[i][0]; | |
110 } | |
111 | |
112 public long GetChars(int i, long fieldoffset, char[] buffer, int bufferoffset, int length) | |
113 { | |
114 throw new InvalidOperationException(); | |
115 } | |
116 | |
117 public IDataReader GetData(int i) | |
118 { | |
119 throw new InvalidOperationException(); | |
120 } | |
121 | |
122 public string GetDataTypeName(int i) | |
123 { | |
124 return _result.FieldTypes[i].FullName; | |
125 } | |
126 | |
127 public DateTime GetDateTime(int i) | |
128 { | |
129 return DateTime.Parse(_data[i], CultureInfo.InvariantCulture); | |
130 } | |
131 | |
132 public decimal GetDecimal(int i) | |
133 { | |
134 return decimal.Parse(_data[i], CultureInfo.InvariantCulture); | |
135 } | |
136 | |
137 public double GetDouble(int i) | |
138 { | |
139 return double.Parse(_data[i], CultureInfo.InvariantCulture); | |
140 } | |
141 | |
142 public Type GetFieldType(int i) | |
143 { | |
144 return _result.FieldTypes[i]; | |
145 } | |
146 | |
147 public float GetFloat(int i) | |
148 { | |
149 return float.Parse(_data[i], CultureInfo.InvariantCulture); | |
150 } | |
151 | |
152 public Guid GetGuid(int i) | |
153 { | |
154 return new Guid(_data[i]); | |
155 } | |
156 | |
157 public short GetInt16(int i) | |
158 { | |
159 return short.Parse(_data[i]); | |
160 } | |
161 | |
162 public int GetInt32(int i) | |
163 { | |
164 return int.Parse(_data[i]); | |
165 } | |
166 | |
167 public long GetInt64(int i) | |
168 { | |
169 return long.Parse(_data[i]); | |
170 } | |
171 | |
172 public string GetName(int i) | |
173 { | |
174 return _result.FieldNames[i]; | |
175 } | |
176 | |
177 public int GetOrdinal(string name) | |
178 { | |
179 return _ordinal[name]; | |
180 } | |
181 | |
182 public string GetString(int i) | |
183 { | |
184 return _data[i]; | |
185 } | |
186 | |
187 public object GetValue(int i) | |
188 { | |
189 var type = _result.FieldTypes[i]; | |
190 var value = _data[i]; | |
191 | |
192 if (_result.VaryingTypes.Length > 0 && !string.IsNullOrEmpty(value) && value[0] == '\0') | |
193 { | |
194 type = _result.VaryingTypes[value[1]]; | |
195 value = value.Substring(2); | |
196 } | |
197 | |
198 if (value == null) | |
199 return null; | |
200 | |
201 if (type.IsArray && type == typeof(byte[])) | |
202 return System.Convert.FromBase64String(value); | |
203 | |
204 switch (Type.GetTypeCode(type)) | |
205 { | |
206 case TypeCode.String : return value; | |
207 case TypeCode.Double : return double. Parse(value, CultureInfo.InvariantCulture); | |
208 case TypeCode.Decimal : return decimal. Parse(value, CultureInfo.InvariantCulture); | |
209 case TypeCode.Single : return float. Parse(value, CultureInfo.InvariantCulture); | |
210 case TypeCode.DateTime : return DateTime.Parse(value, CultureInfo.InvariantCulture); | |
211 case TypeCode.Object : | |
212 if (type == typeof(double?)) return double. Parse(value, CultureInfo.InvariantCulture); | |
213 if (type == typeof(decimal?)) return decimal. Parse(value, CultureInfo.InvariantCulture); | |
214 if (type == typeof(float?)) return float. Parse(value, CultureInfo.InvariantCulture); | |
215 if (type == typeof(DateTime?)) return DateTime. Parse(value, CultureInfo.InvariantCulture); | |
216 | |
217 if (type == typeof(DateTimeOffset) || type == typeof(DateTimeOffset?)) | |
218 return DateTimeOffset.Parse(value, CultureInfo.InvariantCulture); | |
219 break; | |
220 } | |
221 | |
222 return Convert.ChangeTypeFromString(value, type); | |
223 } | |
224 | |
225 public int GetValues(object[] values) | |
226 { | |
227 throw new InvalidOperationException(); | |
228 } | |
229 | |
230 public bool IsDBNull(int i) | |
231 { | |
232 return _data[i] == null; | |
233 } | |
234 | |
235 public object this[string name] | |
236 { | |
237 get { return GetValue(GetOrdinal(name)); } | |
238 } | |
239 | |
240 public object this[int i] | |
241 { | |
242 get { return GetValue(i); } | |
243 } | |
244 | |
245 #endregion | |
246 } | |
247 } |