annotate Source/Data/DataProvider/AccessDataProvider.cs @ 1:8f65451dc28f

Исправлена проблема с фабрикой и выборкой нескольких объектов в linq выражении
author cin
date Fri, 28 Mar 2014 01:04:56 +0400
parents f990fcb411a9
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.Data;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3 using System.Data.OleDb;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4 using System.Text.RegularExpressions;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
5
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
6 namespace BLToolkit.Data.DataProvider
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
7 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
8 using Mapping;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
9 using Sql.SqlProvider;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
10
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
11 public class AccessDataProvider : OleDbDataProvider
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
12 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
13 private static Regex _paramsExp;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
14
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
15 // Based on idea from http://qapi.blogspot.com/2006/12/deriveparameters-oledbprovider-ii.html
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
16 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
17 public override bool DeriveParameters(IDbCommand command)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
18 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
19 if (command == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
20 throw new ArgumentNullException("command");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
21
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
22 if (command.CommandType != CommandType.StoredProcedure)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
23 throw new InvalidOperationException("command.CommandType must be CommandType.StoredProcedure");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
24
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
25 var conn = command.Connection as OleDbConnection;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
26
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
27 if (conn == null || conn.State != ConnectionState.Open)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
28 throw new InvalidOperationException("Invalid connection state.");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
29
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
30 command.Parameters.Clear();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
31
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
32 var dt = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Procedures, new object[]{null, null, command.CommandText});
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
33
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
34 if (dt.Rows.Count == 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
35 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
36 // Jet does convert parameretless procedures to views.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
37 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
38 dt = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Views, new object[]{null, null, command.CommandText});
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
39
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
40 if (dt.Rows.Count == 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
41 throw new DataException(string.Format("Stored procedure '{0}' not found", command.CommandText));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
42
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
43 // Do nothing. There is no parameters.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
44 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
45 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
46 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
47 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
48 var col = dt.Columns["PROCEDURE_DEFINITION"];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
49
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
50 if (col == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
51 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
52 // Not really possible
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
53 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
54 return false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
55 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
56
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
57 if (_paramsExp == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
58 _paramsExp = new Regex(@"PARAMETERS ((\[(?<name>[^\]]+)\]|(?<name>[^\s]+))\s(?<type>[^,;\s]+(\s\([^\)]+\))?)[,;]\s)*", RegexOptions.Compiled | RegexOptions.ExplicitCapture);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
59
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
60 var match = _paramsExp.Match((string)dt.Rows[0][col.Ordinal]);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
61 var names = match.Groups["name"].Captures;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
62 var types = match.Groups["type"].Captures;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
63
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
64 if (names.Count != types.Count)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
65 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
66 // Not really possible
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
67 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
68 return false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
69 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
70
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
71 var separators = new[] {' ', '(', ',', ')'};
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
72
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
73 for (var i = 0; i < names.Count; ++i)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
74 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
75 var paramName = names[i].Value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
76 var rawType = types[i].Value.Split(separators, StringSplitOptions.RemoveEmptyEntries);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
77 var p = new OleDbParameter(paramName, GetOleDbType(rawType[0]));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
78
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
79 if (rawType.Length > 2)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
80 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
81 p.Precision = Common.Convert.ToByte(rawType[1]);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
82 p.Scale = Common.Convert.ToByte(rawType[2]);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
83 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
84 else if (rawType.Length > 1)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
85 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
86 p.Size = Common.Convert.ToInt32(rawType[1]);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
87 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
88
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
89 command.Parameters.Add(p);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
90 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
91 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
92
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
93 return true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
94 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
95
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
96 private static OleDbType GetOleDbType(string jetType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
97 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
98 switch (jetType.ToLower())
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
99 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
100 case "byte":
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
101 case "tinyint":
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
102 case "integer1":
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
103 return OleDbType.TinyInt;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
104
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
105 case "short":
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
106 case "smallint":
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
107 case "integer2":
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
108 return OleDbType.SmallInt;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
109
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
110 case "int":
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
111 case "integer":
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
112 case "long":
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
113 case "integer4":
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
114 case "counter":
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
115 case "identity":
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
116 case "autoincrement":
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
117 return OleDbType.Integer;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
118
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
119 case "single":
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
120 case "real":
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
121 case "float4":
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
122 case "ieeesingle":
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
123 return OleDbType.Single;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
124
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
125
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
126 case "double":
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
127 case "number":
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
128 case "double precision":
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
129 case "float":
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
130 case "float8":
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
131 case "ieeedouble":
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
132 return OleDbType.Double;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
133
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
134 case "currency":
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
135 case "money":
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
136 return OleDbType.Currency;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
137
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
138 case "dec":
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
139 case "decimal":
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
140 case "numeric":
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
141 return OleDbType.Decimal;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
142
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
143 case "bit":
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
144 case "yesno":
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
145 case "logical":
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
146 case "logical1":
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
147 return OleDbType.Boolean;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
148
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
149 case "datetime":
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
150 case "date":
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
151 case "time":
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
152 return OleDbType.Date;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
153
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
154 case "alphanumeric":
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
155 case "char":
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
156 case "character":
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
157 case "character varying":
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
158 case "national char":
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
159 case "national char varying":
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
160 case "national character":
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
161 case "national character varying":
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
162 case "nchar":
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
163 case "string":
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
164 case "text":
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
165 case "varchar":
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
166 return OleDbType.VarWChar;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
167
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
168 case "longchar":
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
169 case "longtext":
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
170 case "memo":
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
171 case "note":
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
172 case "ntext":
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
173 return OleDbType.LongVarWChar;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
174
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
175 case "binary":
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
176 case "varbinary":
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
177 case "binary varying":
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
178 case "bit varying":
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
179 return OleDbType.VarBinary;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
180
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
181 case "longbinary":
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
182 case "image":
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
183 case "general":
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
184 case "oleobject":
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
185 return OleDbType.LongVarBinary;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
186
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
187 case "guid":
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
188 case "uniqueidentifier":
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
189 return OleDbType.Guid;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
190
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
191 default:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
192 // Each release of Jet brings many new aliases to existing types.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
193 // This list may be outdated, please send a report to us.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
194 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
195 throw new NotSupportedException("Unknown DB type '" + jetType + "'");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
196 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
197 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
198
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
199 public override void AttachParameter(IDbCommand command, IDbDataParameter parameter)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
200 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
201 // Do some magic to workaround 'Data type mismatch in criteria expression' error
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
202 // in JET for some european locales.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
203 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
204 if (parameter.Value is DateTime)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
205 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
206 // OleDbType.DBTimeStamp is locale aware, OleDbType.Date is locale neutral.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
207 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
208 ((OleDbParameter)parameter).OleDbType = OleDbType.Date;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
209 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
210 else if (parameter.Value is decimal)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
211 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
212 // OleDbType.Decimal is locale aware, OleDbType.Currency is locale neutral.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
213 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
214 ((OleDbParameter)parameter).OleDbType = OleDbType.Currency;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
215 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
216
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
217 base.AttachParameter(command, parameter);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
218 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
219
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
220 public new const string NameString = DataProvider.ProviderName.Access;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
221
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
222 public override string Name
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
223 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
224 get { return NameString; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
225 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
226
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
227 public override int MaxBatchSize
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
228 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
229 get { return 0; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
230 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
231
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
232 public override ISqlProvider CreateSqlProvider()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
233 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
234 return new AccessSqlProvider();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
235 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
236
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
237 public override object Convert(object value, ConvertType convertType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
238 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
239 switch (convertType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
240 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
241 case ConvertType.ExceptionToErrorNumber:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
242 if (value is OleDbException)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
243 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
244 var ex = (OleDbException)value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
245 if (ex.Errors.Count > 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
246 return ex.Errors[0].NativeError;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
247 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
248
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
249 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
250 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
251
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
252 return SqlProvider.Convert(value, convertType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
253 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
254
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
255 #region DataReaderEx
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
256
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
257 public override IDataReader GetDataReader(MappingSchema schema, IDataReader dataReader)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
258 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
259 return dataReader is OleDbDataReader?
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
260 new DataReaderEx((OleDbDataReader)dataReader):
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
261 base.GetDataReader(schema, dataReader);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
262 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
263
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
264 class DataReaderEx : DataReaderBase<OleDbDataReader>, IDataReader
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
265 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
266 public DataReaderEx(OleDbDataReader rd): base(rd)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
267 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
268 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
269
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
270 public new object GetValue(int i)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
271 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
272 var value = DataReader.GetValue(i);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
273
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
274 if (value is DateTime)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
275 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
276 var dt = (DateTime)value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
277
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
278 if (dt.Year == 1899 && dt.Month == 12 && dt.Day == 30)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
279 return new DateTime(1, 1, 1, dt.Hour, dt.Minute, dt.Second, dt.Millisecond);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
280 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
281
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
282 return value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
283 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
284
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
285 public new DateTime GetDateTime(int i)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
286 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
287 var dt = DataReader.GetDateTime(i);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
288
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
289 if (dt.Year == 1899 && dt.Month == 12 && dt.Day == 30)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
290 return new DateTime(1, 1, 1, dt.Hour, dt.Minute, dt.Second, dt.Millisecond);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
291
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
292 return dt;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
293 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
294 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
295
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
296 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
297 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
298 }