annotate Source/Data/Sql/SqlProvider/AccessSqlProvider.cs @ 9:1e85f66cf767 default tip

update bltoolkit
author nickolay
date Thu, 05 Apr 2018 20:53:26 +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.Text;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
5 namespace BLToolkit.Data.Sql.SqlProvider
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
6 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
7 using DataProvider;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
8 using Reflection;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
9
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
10 public class AccessSqlProvider : BasicSqlProvider
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
11 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
12 public override int CommandCount(SqlQuery sqlQuery)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
13 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
14 return sqlQuery.IsInsert && sqlQuery.Insert.WithIdentity ? 2 : 1;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
15 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
16
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
17 protected override void BuildCommand(int commandNumber, StringBuilder sb)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
18 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
19 sb.AppendLine("SELECT @@IDENTITY");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
20 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
21
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
22 //public override bool IsSkipSupported { get { return SqlQuery.Select.TakeValue != null; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
23 public override bool IsSkipSupported { get { return false; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
24 public override bool TakeAcceptsParameter { get { return false; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
25 public override bool IsCountSubQuerySupported { get { return false; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
26 public override bool IsNestedJoinSupported { get { return false; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
27 public override bool IsInsertOrUpdateSupported { get { return false; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
28
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
29 public override bool ConvertCountSubQuery(SqlQuery subQuery)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
30 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
31 return !subQuery.Where.IsEmpty;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
32 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
33
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
34 #region Skip / Take Support
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
35
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
36 protected override string FirstFormat { get { return "TOP {0}"; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
37
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
38 protected override void BuildSql(StringBuilder sb)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
39 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
40 if (NeedSkip)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
41 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
42 AlternativeBuildSql2(sb, base.BuildSql);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
43 return;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
44 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
45
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
46 if (SqlQuery.From.Tables.Count == 0 && SqlQuery.Select.Columns.Count == 1)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
47 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
48 if (SqlQuery.Select.Columns[0].Expression is SqlFunction)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
49 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
50 var func = (SqlFunction)SqlQuery.Select.Columns[0].Expression;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
51
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
52 if (func.Name == "Iif" && func.Parameters.Length == 3 && func.Parameters[0] is SqlQuery.SearchCondition)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
53 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
54 var sc = (SqlQuery.SearchCondition)func.Parameters[0];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
55
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
56 if (sc.Conditions.Count == 1 && sc.Conditions[0].Predicate is SqlQuery.Predicate.FuncLike)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
57 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
58 var p = (SqlQuery.Predicate.FuncLike)sc.Conditions[0].Predicate;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
59
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
60 if (p.Function.Name == "EXISTS")
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
61 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
62 BuildAnyAsCount(sb);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
63 return;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
64 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
65 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
66 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
67 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
68 else if (SqlQuery.Select.Columns[0].Expression is SqlQuery.SearchCondition)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
69 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
70 var sc = (SqlQuery.SearchCondition)SqlQuery.Select.Columns[0].Expression;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
71
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
72 if (sc.Conditions.Count == 1 && sc.Conditions[0].Predicate is SqlQuery.Predicate.FuncLike)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
73 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
74 var p = (SqlQuery.Predicate.FuncLike)sc.Conditions[0].Predicate;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
75
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
76 if (p.Function.Name == "EXISTS")
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
77 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
78 BuildAnyAsCount(sb);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
79 return;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
80 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
81 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
82 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
83 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
84
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
85 base.BuildSql(sb);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
86 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
87
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
88 SqlQuery.Column _selectColumn;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
89
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
90 void BuildAnyAsCount(StringBuilder sb)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
91 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
92 SqlQuery.SearchCondition cond;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
93
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
94 if (SqlQuery.Select.Columns[0].Expression is SqlFunction)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
95 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
96 var func = (SqlFunction)SqlQuery.Select.Columns[0].Expression;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
97 cond = (SqlQuery.SearchCondition)func.Parameters[0];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
98 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
99 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
100 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
101 cond = (SqlQuery.SearchCondition)SqlQuery.Select.Columns[0].Expression;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
102 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
103
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
104 var exist = ((SqlQuery.Predicate.FuncLike)cond.Conditions[0].Predicate).Function;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
105 var query = (SqlQuery)exist.Parameters[0];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
106
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
107 _selectColumn = new SqlQuery.Column(SqlQuery, new SqlExpression(cond.Conditions[0].IsNot ? "Count(*) = 0" : "Count(*) > 0"), SqlQuery.Select.Columns[0].Alias);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
108
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
109 BuildSql(0, query, sb, 0, 0, false);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
110
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
111 _selectColumn = null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
112 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
113
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
114 protected override IEnumerable<SqlQuery.Column> GetSelectedColumns()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
115 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
116 if (_selectColumn != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
117 return new[] { _selectColumn };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
118
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
119 if (NeedSkip && !SqlQuery.OrderBy.IsEmpty)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
120 return AlternativeGetSelectedColumns(base.GetSelectedColumns);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
121
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
122 return base.GetSelectedColumns();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
123 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
124
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
125 protected override void BuildSkipFirst(StringBuilder sb)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
126 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
127 if (NeedSkip)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
128 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
129 if (!NeedTake)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
130 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
131 sb.AppendFormat(" TOP {0}", int.MaxValue);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
132 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
133 else if (!SqlQuery.OrderBy.IsEmpty)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
134 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
135 sb.Append(" TOP ");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
136 BuildExpression(sb, Add<int>(SqlQuery.Select.SkipValue, SqlQuery.Select.TakeValue));
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 base.BuildSkipFirst(sb);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
141 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
142
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
143 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
144
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
145 protected override ISqlProvider CreateSqlProvider()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
146 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
147 return new AccessSqlProvider();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
148 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
149
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
150 protected override bool ParenthesizeJoin()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
151 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
152 return true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
153 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
154
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
155 public override ISqlPredicate ConvertPredicate(ISqlPredicate predicate)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
156 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
157 if (predicate is SqlQuery.Predicate.Like)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
158 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
159 var l = (SqlQuery.Predicate.Like)predicate;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
160
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
161 if (l.Escape != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
162 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
163 if (l.Expr2 is SqlValue && l.Escape is SqlValue)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
164 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
165 var text = ((SqlValue) l.Expr2).Value.ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
166 var val = new SqlValue(ReescapeLikeText(text, (char)((SqlValue)l.Escape).Value));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
167
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
168 return new SqlQuery.Predicate.Like(l.Expr1, l.IsNot, val, null);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
169 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
170
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
171 if (l.Expr2 is SqlParameter)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
172 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
173 var p = (SqlParameter)l.Expr2;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
174 var v = "";
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
175
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
176 if (p.ValueConverter != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
177 v = p.ValueConverter(" ") as string;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
178
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
179 p.SetLikeConverter(v.StartsWith("%") ? "%" : "", v.EndsWith("%") ? "%" : "");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
180
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
181 return new SqlQuery.Predicate.Like(l.Expr1, l.IsNot, p, null);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
182 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
183 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
184 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
185
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
186 return base.ConvertPredicate(predicate);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
187 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
188
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
189 static string ReescapeLikeText(string text, char esc)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
190 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
191 var sb = new StringBuilder(text.Length);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
192
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
193 for (var i = 0; i < text.Length; i++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
194 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
195 var c = text[i];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
196
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
197 if (c == esc)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
198 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
199 sb.Append('[');
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
200 sb.Append(text[++i]);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
201 sb.Append(']');
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
202 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
203 else if (c == '[')
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
204 sb.Append("[[]");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
205 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
206 sb.Append(c);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
207 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
208
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
209 return sb.ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
210 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
211
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
212 public override ISqlExpression ConvertExpression(ISqlExpression expr)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
213 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
214 expr = base.ConvertExpression(expr);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
215
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
216 if (expr is SqlBinaryExpression)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
217 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
218 var be = (SqlBinaryExpression)expr;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
219
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
220 switch (be.Operation[0])
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
221 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
222 case '%': return new SqlBinaryExpression(be.SystemType, be.Expr1, "MOD", be.Expr2, Precedence.Additive - 1);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
223 case '&':
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
224 case '|':
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
225 case '^': throw new SqlException("Operator '{0}' is not supported by the {1}.", be.Operation, GetType().Name);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
226 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
227 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
228 else if (expr is SqlFunction)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
229 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
230 var func = (SqlFunction) expr;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
231
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
232 switch (func.Name)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
233 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
234 case "Coalesce":
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
235
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
236 if (func.Parameters.Length > 2)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
237 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
238 var parms = new ISqlExpression[func.Parameters.Length - 1];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
239
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
240 Array.Copy(func.Parameters, 1, parms, 0, parms.Length);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
241 return new SqlFunction(func.SystemType, func.Name, func.Parameters[0], new SqlFunction(func.SystemType, func.Name, parms));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
242 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
243
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
244 var sc = new SqlQuery.SearchCondition();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
245
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
246 sc.Conditions.Add(new SqlQuery.Condition(false, new SqlQuery.Predicate.IsNull(func.Parameters[0], false)));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
247
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
248 return new SqlFunction(func.SystemType, "Iif", sc, func.Parameters[1], func.Parameters[0]);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
249
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
250 case "CASE" : return ConvertCase(func.SystemType, func.Parameters, 0);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
251 case "CharIndex" :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
252 return func.Parameters.Length == 2?
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
253 new SqlFunction(func.SystemType, "InStr", new SqlValue(1), func.Parameters[1], func.Parameters[0], new SqlValue(1)):
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
254 new SqlFunction(func.SystemType, "InStr", func.Parameters[2], func.Parameters[1], func.Parameters[0], new SqlValue(1));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
255
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
256 case "Convert" :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
257 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
258 switch (Type.GetTypeCode(TypeHelper.GetUnderlyingType(func.SystemType)))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
259 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
260 case TypeCode.String : return new SqlFunction(func.SystemType, "CStr", func.Parameters[1]);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
261 case TypeCode.DateTime :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
262 if (IsDateDataType(func.Parameters[0], "Date"))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
263 return new SqlFunction(func.SystemType, "DateValue", func.Parameters[1]);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
264
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
265 if (IsTimeDataType(func.Parameters[0]))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
266 return new SqlFunction(func.SystemType, "TimeValue", func.Parameters[1]);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
267
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
268 return new SqlFunction(func.SystemType, "CDate", func.Parameters[1]);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
269
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
270 default:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
271 if (func.SystemType == typeof(DateTime))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
272 goto case TypeCode.DateTime;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
273 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
274 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
275
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
276 return func.Parameters[1];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
277 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
278
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
279 /*
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
280 case "Convert" :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
281 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
282 string name = null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
283
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
284 switch (((SqlDataType)func.Parameters[0]).DbType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
285 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
286 case SqlDbType.BigInt : name = "CLng"; break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
287 case SqlDbType.TinyInt : name = "CByte"; break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
288 case SqlDbType.Int :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
289 case SqlDbType.SmallInt : name = "CInt"; break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
290 case SqlDbType.Bit : name = "CBool"; break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
291 case SqlDbType.Char :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
292 case SqlDbType.Text :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
293 case SqlDbType.VarChar :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
294 case SqlDbType.NChar :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
295 case SqlDbType.NText :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
296 case SqlDbType.NVarChar : name = "CStr"; break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
297 case SqlDbType.DateTime :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
298 case SqlDbType.Date :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
299 case SqlDbType.Time :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
300 case SqlDbType.DateTime2 :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
301 case SqlDbType.SmallDateTime :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
302 case SqlDbType.DateTimeOffset : name = "CDate"; break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
303 case SqlDbType.Decimal : name = "CDec"; break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
304 case SqlDbType.Float : name = "CDbl"; break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
305 case SqlDbType.Money :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
306 case SqlDbType.SmallMoney : name = "CCur"; break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
307 case SqlDbType.Real : name = "CSng"; break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
308 case SqlDbType.Image :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
309 case SqlDbType.Binary :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
310 case SqlDbType.UniqueIdentifier :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
311 case SqlDbType.Timestamp :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
312 case SqlDbType.VarBinary :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
313 case SqlDbType.Variant :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
314 case SqlDbType.Xml :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
315 case SqlDbType.Udt :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
316 case SqlDbType.Structured : name = "CVar"; break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
317 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
318
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
319 return new SqlFunction(name, func.Parameters[1]);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
320 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
321 */
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
322 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
323 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
324
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
325 return expr;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
326 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
327
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
328 SqlFunction ConvertCase(Type systemType, ISqlExpression[] parameters, int start)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
329 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
330 var len = parameters.Length - start;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
331
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
332 if (len < 3)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
333 throw new SqlException("CASE statement is not supported by the {0}.", GetType().Name);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
334
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
335 if (len == 3)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
336 return new SqlFunction(systemType, "Iif", parameters[start], parameters[start + 1], parameters[start + 2]);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
337
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
338 return new SqlFunction(systemType, "Iif", parameters[start], parameters[start + 1], ConvertCase(systemType, parameters, start + 2));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
339 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
340
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
341 public override void BuildValue(StringBuilder sb, object value)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
342 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
343 if (value is bool)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
344 sb.Append(value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
345 else if (value is Guid)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
346 sb.Append("'").Append(((Guid)value).ToString("B")).Append("'");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
347 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
348 base.BuildValue(sb, value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
349 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
350
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
351 public override SqlQuery Finalize(SqlQuery sqlQuery)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
352 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
353 sqlQuery = base.Finalize(sqlQuery);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
354
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
355 switch (sqlQuery.QueryType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
356 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
357 case QueryType.Delete : return GetAlternativeDelete(sqlQuery);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
358 default : return sqlQuery;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
359 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
360 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
361
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
362 protected override void BuildUpdateClause(StringBuilder sb)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
363 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
364 base.BuildFromClause(sb);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
365 sb.Remove(0, 4).Insert(0, "UPDATE");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
366 base.BuildUpdateSet(sb);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
367 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
368
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
369 protected override void BuildFromClause(StringBuilder sb)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
370 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
371 if (!SqlQuery.IsUpdate)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
372 base.BuildFromClause(sb);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
373 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
374
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
375 public override object Convert(object value, ConvertType convertType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
376 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
377 switch (convertType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
378 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
379 case ConvertType.NameToQueryParameter:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
380 case ConvertType.NameToCommandParameter:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
381 case ConvertType.NameToSprocParameter:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
382 return "@" + value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
383
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
384 case ConvertType.NameToQueryField:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
385 case ConvertType.NameToQueryFieldAlias:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
386 case ConvertType.NameToQueryTableAlias:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
387 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
388 var name = value.ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
389
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
390 if (name.Length > 0 && name[0] == '[')
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
391 return value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
392 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
393
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
394 return "[" + value + "]";
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
395
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
396 case ConvertType.NameToDatabase:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
397 case ConvertType.NameToOwner:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
398 case ConvertType.NameToQueryTable:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
399 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
400 var name = value.ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
401
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
402 if (name.Length > 0 && name[0] == '[')
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
403 return value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
404
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
405 if (name.IndexOf('.') > 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
406 value = string.Join("].[", name.Split('.'));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
407 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
408
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
409 return "[" + value + "]";
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
410
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
411 case ConvertType.SprocParameterToName:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
412 if (value != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
413 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
414 var str = value.ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
415 return str.Length > 0 && str[0] == '@'? str.Substring(1): str;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
416 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
417
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
418 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
419 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
420
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
421 return value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
422 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
423
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
424 protected override void BuildDateTime(StringBuilder sb, object value)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
425 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
426 sb.Append(string.Format("#{0:yyyy-MM-dd HH:mm:ss}#", value));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
427 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
428 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
429 }