annotate Source/Data/DbManager.Linq.cs @ 6:11b6da379593

Исправлена странная ошибка при использовании OfType<...>().Where(...)
author cin
date Mon, 05 Dec 2016 05:50:52 +0300
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.Collections.Generic;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3 using System.Data;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4 using System.Linq;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
5 using System.Reflection;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
6 using System.Text;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
7
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
8 using BLToolkit.Aspects;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
9
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
10 namespace BLToolkit.Data
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
11 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
12 using DataProvider;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
13 using Linq;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
14 using Sql;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
15 using Sql.SqlProvider;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
16
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
17 public partial class DbManager : IDataContext
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
18 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
19 public Table<T> GetTable<T>()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
20 where T : class
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
21 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
22 return new Table<T>(this);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
23 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
24
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
25 public Table<T> GetTable<T>(bool dispose)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
26 where T : class
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
27 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
28 return new Table<T>(new DataContextInfo(this, dispose));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
29 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
30
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
31 public Table<T> GetTable<T>(object instance, [NotNull]MethodInfo methodInfo, [NotNull] params object[] parameters)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
32 where T : class
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
33 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
34 return Linq.Extensions.GetTable<T>(this, instance, methodInfo, parameters);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
35 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
36
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
37 class PreparedQuery
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
38 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
39 public string[] Commands;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
40 public List<SqlParameter> SqlParameters;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
41 public IDbDataParameter[] Parameters;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
42 public SqlQuery SqlQuery;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
43 public ISqlProvider SqlProvider;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
44 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
45
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
46 #region SetQuery
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
47
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
48 object IDataContext.SetQuery(IQueryContext queryContext)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
49 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
50 var query = GetCommand(queryContext);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
51
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
52 GetParameters(queryContext, query);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
53
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
54 if (TraceSwitch.TraceInfo)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
55 WriteTraceLine(((IDataContext)this).GetSqlText(query).Replace("\r", ""), TraceSwitch.DisplayName);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
56
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
57 return query;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
58 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
59
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
60 PreparedQuery GetCommand(IQueryContext query)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
61 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
62 if (query.Context != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
63 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
64 return new PreparedQuery
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
65 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
66 Commands = (string[])query.Context,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
67 SqlParameters = query.SqlQuery.Parameters,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
68 SqlQuery = query.SqlQuery
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
69 };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
70 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
71
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
72 var sql = query.SqlQuery.ProcessParameters();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
73
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
74 var newSql = ProcessQuery(sql);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
75
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
76 if (sql != newSql)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
77 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
78 sql = newSql;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
79 sql.IsParameterDependent = true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
80 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
81
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
82 var sqlProvider = DataProvider.CreateSqlProvider();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
83
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
84 var cc = sqlProvider.CommandCount(sql);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
85 var sb = new StringBuilder();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
86
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
87 var commands = new string[cc];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
88
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
89 for (var i = 0; i < cc; i++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
90 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
91 sb.Length = 0;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
92
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
93 sqlProvider.BuildSql(i, sql, sb, 0, 0, false);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
94 commands[i] = sb.ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
95 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
96
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
97 if (!query.SqlQuery.IsParameterDependent)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
98 query.Context = commands;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
99
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
100 return new PreparedQuery
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
101 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
102 Commands = commands,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
103 SqlParameters = sql.Parameters,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
104 SqlQuery = sql,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
105 SqlProvider = sqlProvider
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
106 };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
107 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
108
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
109 protected virtual SqlQuery ProcessQuery(SqlQuery sqlQuery)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
110 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
111 return sqlQuery;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
112 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
113
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
114 void GetParameters(IQueryContext query, PreparedQuery pq)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
115 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
116 var parameters = query.GetParameters();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
117
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
118 if (parameters.Length == 0 && pq.SqlParameters.Count == 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
119 return;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
120
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
121 var x = DataProvider.Convert("x", ConvertType.NameToQueryParameter).ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
122 var y = DataProvider.Convert("y", ConvertType.NameToQueryParameter).ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
123
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
124 var parms = new List<IDbDataParameter>(x == y ? pq.SqlParameters.Count : parameters.Length);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
125
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
126 if (x == y)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
127 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
128 for (var i = 0; i < pq.SqlParameters.Count; i++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
129 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
130 var sqlp = pq.SqlParameters[i];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
131
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
132 if (sqlp.IsQueryParameter)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
133 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
134 var parm = parameters.Length > i && parameters[i] == sqlp ? parameters[i] : parameters.First(p => p == sqlp);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
135 AddParameter(parms, x, parm);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
136 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
137 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
138 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
139 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
140 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
141 foreach (var parm in parameters)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
142 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
143 if (parm.IsQueryParameter && pq.SqlParameters.Contains(parm))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
144 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
145 var name = DataProvider.Convert(parm.Name, ConvertType.NameToQueryParameter).ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
146 AddParameter(parms, name, parm);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
147 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
148 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
149 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
150
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
151 pq.Parameters = parms.ToArray();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
152 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
153
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
154 void AddParameter(ICollection<IDbDataParameter> parms, string name, SqlParameter parm)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
155 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
156 var value = MappingSchema.ConvertParameterValue(parm.Value, parm.SystemType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
157
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
158 if (value != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
159 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
160 if (parm.DbType == DbType.Object)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
161 parms.Add(Parameter(name, value));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
162 else if (parm.DbSize == 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
163 parms.Add(Parameter(name, value, parm.DbType));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
164 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
165 parms.Add(Parameter(name, value, parm.DbType, parm.DbSize));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
166 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
167 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
168 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
169 var dataType = DataProvider.GetDbType(parm.SystemType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
170 if (parm.DbType != DbType.Object)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
171 dataType = parm.DbType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
172 parms.Add(dataType == DbType.Object ? Parameter(name, value) : Parameter(name, null, dataType));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
173 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
174 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
175
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
176 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
177
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
178 #region ExecuteXXX
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
179
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
180 int IDataContext.ExecuteNonQuery(object query)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
181 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
182 var pq = (PreparedQuery)query;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
183
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
184 SetCommand(pq.Commands[0], pq.Parameters);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
185
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
186 var now = default(DateTime);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
187
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
188 if (TraceSwitch.TraceInfo)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
189 now = DateTime.Now;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
190
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
191 var n = ExecuteNonQuery();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
192
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
193 if (TraceSwitch.TraceInfo)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
194 WriteTraceLine(string.Format("Execution time: {0}. Records affected: {1}.\r\n", DateTime.Now - now, n), TraceSwitch.DisplayName);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
195
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
196 return n;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
197 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
198
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
199 object IDataContext.ExecuteScalar(object query)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
200 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
201 var now = default(DateTime);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
202
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
203 if (TraceSwitch.TraceInfo)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
204 now = DateTime.Now;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
205
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
206 var ret = ExecuteScalarInternal(query);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
207
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
208 if (TraceSwitch.TraceInfo)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
209 WriteTraceLine(string.Format("Execution time: {0}\r\n", DateTime.Now - now), TraceSwitch.DisplayName);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
210
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
211 return ret;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
212 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
213
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
214 object ExecuteScalarInternal(object query)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
215 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
216 var pq = (PreparedQuery)query;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
217
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
218 SetCommand(pq.Commands[0], pq.Parameters);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
219
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
220 IDbDataParameter idparam = null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
221
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
222 if ((pq.SqlProvider ?? DataProvider.CreateSqlProvider()).IsIdentityParameterRequired)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
223 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
224 var sql = pq.SqlQuery;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
225
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
226 if (sql.IsInsert && sql.Insert.WithIdentity)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
227 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
228 var pname = DataProvider.Convert("IDENTITY_PARAMETER", ConvertType.NameToQueryParameter).ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
229 idparam = OutputParameter(pname, DbType.Decimal);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
230 DataProvider.AttachParameter(Command, idparam);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
231 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
232 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
233
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
234 if (pq.Commands.Length == 1)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
235 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
236 if (idparam != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
237 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
238 ExecuteNonQuery(); // так сделано потому, что фаерберд провайдер не возвращает никаких параметров через ExecuteReader
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
239 // остальные провайдеры должны поддерживать такой режим
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
240 return idparam.Value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
241 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
242
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
243 return ExecuteScalar();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
244 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
245
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
246 ExecuteNonQuery();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
247
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
248 return SetCommand(pq.Commands[1]).ExecuteScalar();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
249 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
250
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
251 IDataReader IDataContext.ExecuteReader(object query)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
252 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
253 var pq = (PreparedQuery)query;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
254
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
255 SetCommand(pq.Commands[0], pq.Parameters);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
256
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
257 var now = default(DateTime);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
258
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
259 if (TraceSwitch.TraceInfo)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
260 now = DateTime.Now;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
261
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
262 var ret = ExecuteReader();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
263
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
264 if (TraceSwitch.TraceInfo)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
265 WriteTraceLine(string.Format("Execution time: {0}\r\n", DateTime.Now - now), TraceSwitch.DisplayName);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
266
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
267 return ret;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
268 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
269
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
270 void IDataContext.ReleaseQuery(object query)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
271 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
272 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
273
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
274 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
275
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
276 #region GetSqlText
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
277
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
278 string IDataContext.GetSqlText(object query)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
279 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
280 var pq = (PreparedQuery)query;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
281
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
282 var sqlProvider = pq.SqlProvider ?? DataProvider.CreateSqlProvider();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
283
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
284 var sb = new StringBuilder();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
285
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
286 sb.Append("-- ").Append(ConfigurationString);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
287
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
288 if (ConfigurationString != DataProvider.Name)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
289 sb.Append(' ').Append(DataProvider.Name);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
290
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
291 if (DataProvider.Name != sqlProvider.Name)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
292 sb.Append(' ').Append(sqlProvider.Name);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
293
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
294 sb.AppendLine();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
295
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
296 if (pq.Parameters != null && pq.Parameters.Length > 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
297 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
298 foreach (var p in pq.Parameters)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
299 sb
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
300 .Append("-- DECLARE ")
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
301 .Append(p.ParameterName)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
302 .Append(' ')
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
303 .Append(p.Value == null ? p.DbType.ToString() : p.Value.GetType().Name)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
304 .AppendLine();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
305
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
306 sb.AppendLine();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
307
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
308 foreach (var p in pq.Parameters)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
309 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
310 var value = p.Value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
311
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
312 if (value is string || value is char)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
313 value = "'" + value.ToString().Replace("'", "''") + "'";
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
314
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
315 sb
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
316 .Append("-- SET ")
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
317 .Append(p.ParameterName)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
318 .Append(" = ")
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
319 .Append(value)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
320 .AppendLine();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
321 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
322
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
323 sb.AppendLine();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
324 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
325
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
326 foreach (var command in pq.Commands)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
327 sb.AppendLine(command);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
328
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
329 while (sb[sb.Length - 1] == '\n' || sb[sb.Length - 1] == '\r')
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
330 sb.Length--;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
331
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
332 sb.AppendLine();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
333
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
334 return sb.ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
335 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
336
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
337 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
338
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
339 #region IDataContext Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
340
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
341 IDataContext IDataContext.Clone(bool forNestedQuery)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
342 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
343 if (forNestedQuery && _connection != null && IsMarsEnabled)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
344 return new DbManager(_dataProvider, _connection) { _mappingSchema = _mappingSchema, _transaction = _transaction };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
345
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
346 return Clone();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
347 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
348
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
349 string IDataContext.ContextID
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
350 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
351 get { return DataProvider.Name; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
352 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
353
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
354 static Func<ISqlProvider> GetCreateSqlProvider(DataProviderBase dp)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
355 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
356 return dp.CreateSqlProvider;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
357 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
358
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
359 Func<ISqlProvider> IDataContext.CreateSqlProvider
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
360 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
361 get { return GetCreateSqlProvider(DataProvider); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
362 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
363
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
364 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
365 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
366 }