Mercurial > pub > bltoolkit
comparison Source/Data/DataProvider/Interpreters/OracleDataProviderInterpreter.cs @ 0:f990fcb411a9
Копия текущей версии из github
author | cin |
---|---|
date | Thu, 27 Mar 2014 21:46:09 +0400 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:f990fcb411a9 |
---|---|
1 using System; | |
2 using System.Collections.Generic; | |
3 using System.Data; | |
4 using System.Linq; | |
5 using System.Text; | |
6 using BLToolkit.Data.Sql.SqlProvider; | |
7 using BLToolkit.DataAccess; | |
8 using BLToolkit.Mapping; | |
9 | |
10 namespace BLToolkit.Data.DataProvider.Interpreters | |
11 { | |
12 public class OracleDataProviderInterpreter : DataProviderInterpreterBase | |
13 { | |
14 public override void SetParameterValue(IDbDataParameter parameter, object value) | |
15 { | |
16 if (value is TimeSpan) | |
17 { | |
18 parameter.Value = ((TimeSpan)value).ToString(); | |
19 } | |
20 else | |
21 base.SetParameterValue(parameter, value); | |
22 } | |
23 | |
24 public override List<string> GetInsertBatchSqlList<T>( | |
25 string insertText, | |
26 IEnumerable<T> collection, | |
27 MemberMapper[] members, | |
28 int maxBatchSize, | |
29 bool withIdentity) | |
30 { | |
31 //return GetInsertBatchSqlListWithInsertAll(insertText, collection, members, maxBatchSize); | |
32 return GetInsertBatchSqlListUnionAll(insertText, collection, members, maxBatchSize, withIdentity); | |
33 } | |
34 | |
35 private List<string> GetInsertBatchSqlListUnionAll<T>( | |
36 string insertText, | |
37 IEnumerable<T> collection, | |
38 MemberMapper[] members, | |
39 int maxBatchSize, | |
40 bool withIdentity) | |
41 { | |
42 var sp = new OracleSqlProvider(); | |
43 var n = 0; | |
44 var sqlList = new List<string>(); | |
45 | |
46 var indexValuesWord = insertText.IndexOf(" VALUES (", StringComparison.Ordinal); | |
47 var initQuery = insertText.Substring(0, indexValuesWord) + Environment.NewLine; | |
48 var valuesQuery = insertText.Substring(indexValuesWord + 9); | |
49 var indexEndValuesQuery = valuesQuery.IndexOf(")"); | |
50 valuesQuery = valuesQuery.Substring(0, indexEndValuesQuery) | |
51 .Replace("\r", "") | |
52 .Replace("\n", "") | |
53 .Replace("\t", ""); | |
54 | |
55 // 1 = Number of primary keys generated by sequence | |
56 var valuesWihtoutSequence = withIdentity ? valuesQuery.Substring(valuesQuery.IndexOf(",") + 1) : valuesQuery; | |
57 | |
58 var sb = new StringBuilder(initQuery); | |
59 sb.Append(" SELECT "); | |
60 sb.AppendFormat(valuesQuery, members.Select(m => m.Name).ToArray()); | |
61 sb.AppendLine(" FROM ("); | |
62 | |
63 initQuery = sb.ToString(); | |
64 | |
65 sb = new StringBuilder(initQuery); | |
66 bool isFirstValues = true; | |
67 | |
68 foreach (var item in collection) | |
69 { | |
70 if (!isFirstValues) | |
71 sb.AppendLine(" UNION ALL "); | |
72 | |
73 sb.Append("SELECT "); | |
74 | |
75 var values = new List<object>(); | |
76 foreach (var member in members) | |
77 { | |
78 var sbItem = new StringBuilder(); | |
79 | |
80 var value = member.GetValue(item); | |
81 | |
82 if (value is DateTime?) | |
83 value = ((DateTime?)value).Value; | |
84 | |
85 sp.BuildValue(sbItem, value); | |
86 | |
87 values.Add(sbItem + " " + member.Name); | |
88 } | |
89 | |
90 sb.AppendFormat(valuesWihtoutSequence, values.ToArray()); | |
91 sb.Append(" FROM DUAL"); | |
92 | |
93 isFirstValues = false; | |
94 | |
95 n++; | |
96 if (n > maxBatchSize) | |
97 { | |
98 sb.Append(")"); | |
99 sqlList.Add(sb.ToString()); | |
100 sb = new StringBuilder(initQuery); | |
101 isFirstValues = true; | |
102 n = 0; | |
103 } | |
104 } | |
105 | |
106 if (n > 0) | |
107 { | |
108 sb.Append(")"); | |
109 sqlList.Add(sb.ToString()); | |
110 } | |
111 return sqlList; | |
112 } | |
113 | |
114 private List<string> GetInsertBatchSqlListWithInsertAll<T>( | |
115 string insertText, | |
116 IEnumerable<T> collection, | |
117 MemberMapper[] members, | |
118 int maxBatchSize) | |
119 { | |
120 var sb = new StringBuilder(); | |
121 var sp = new OracleSqlProvider(); | |
122 var n = 0; | |
123 var sqlList = new List<string>(); | |
124 | |
125 foreach (var item in collection) | |
126 { | |
127 if (sb.Length == 0) | |
128 sb.AppendLine("INSERT ALL"); | |
129 | |
130 string strItem = "\t" + insertText | |
131 .Replace("INSERT INTO", "INTO") | |
132 .Replace("\r", "") | |
133 .Replace("\n", "") | |
134 .Replace("\t", " ") | |
135 .Replace("( ", "("); | |
136 | |
137 var values = new List<object>(); | |
138 foreach (var member in members) | |
139 { | |
140 var sbItem = new StringBuilder(); | |
141 | |
142 var keyGenerator = member.MapMemberInfo.KeyGenerator as SequenceKeyGenerator; | |
143 if (keyGenerator != null) | |
144 { | |
145 values.Add(NextSequenceQuery(keyGenerator.Sequence)); | |
146 } | |
147 else | |
148 { | |
149 var value = member.GetValue(item); | |
150 | |
151 if (value is DateTime?) | |
152 value = ((DateTime?)value).Value; | |
153 | |
154 sp.BuildValue(sbItem, value); | |
155 | |
156 values.Add(sbItem.ToString()); | |
157 } | |
158 } | |
159 | |
160 sb.AppendFormat(strItem, values.ToArray()); | |
161 sb.AppendLine(); | |
162 | |
163 n++; | |
164 | |
165 if (n >= maxBatchSize) | |
166 { | |
167 sb.AppendLine("SELECT * FROM dual"); | |
168 | |
169 var sql = sb.ToString(); | |
170 sqlList.Add(sql); | |
171 | |
172 n = 0; | |
173 sb.Length = 0; | |
174 } | |
175 } | |
176 | |
177 if (n > 0) | |
178 { | |
179 sb.AppendLine("SELECT * FROM dual"); | |
180 | |
181 var sql = sb.ToString(); | |
182 sqlList.Add(sql); | |
183 } | |
184 | |
185 return sqlList; | |
186 } | |
187 | |
188 public override string GetSequenceQuery(string sequenceName) | |
189 { | |
190 return string.Format("SELECT {0}.NEXTVAL FROM DUAL", sequenceName); | |
191 } | |
192 | |
193 public override string NextSequenceQuery(string sequenceName) | |
194 { | |
195 return string.Format("{0}.NEXTVAL", sequenceName); | |
196 } | |
197 | |
198 public override string GetReturningInto(string columnName) | |
199 { | |
200 return string.Format("returning {0} into :IDENTITY_PARAMETER", columnName); | |
201 } | |
202 } | |
203 } |