annotate DataProviders/DevartOraclePro/DevartOracleDataProvider.cs @ 0:f990fcb411a9

Копия текущей версии из github
author cin
date Thu, 27 Mar 2014 21:46:09 +0400
parents
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.Data.Common;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
5 using System.Text;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
6
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
7 using BLToolkit.Data.Sql.SqlProvider;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
8 using BLToolkit.Mapping;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
9
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
10 using Devart.Data.Oracle;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
11
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
12 namespace BLToolkit.Data.DataProvider
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
13 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
14 public class DevartOracleDataProvider : DataProviderBase
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
15 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
16 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
17 /// Data provider name string.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
18 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
19 public const string NameString = "DevartOracle";
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
20
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
21 public override Type ConnectionType
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
22 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
23 get { return typeof(OracleConnection); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
24 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
25
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
26 public override string Name
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
27 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
28 get { return NameString; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
29 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
30
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
31 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
32 /// Gets or sets the database activity monitor.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
33 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
34 private static Devart.Common.DbMonitor DbMonitor { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
35
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
36 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
37 /// Gets or sets value indicating whether the database activity monitor is enabled.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
38 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
39 /// <remarks>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
40 /// This feature requires Standard or Pro edition of Devart dotConnect for Oracle provider.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
41 /// </remarks>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
42 public static bool DbMonitorActive
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
43 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
44 get { return DbMonitor == null ? false : DbMonitor.IsActive; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
45 set
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
46 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
47 // setting this property has no effect in Express edition
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
48 #if DEVART_PRO
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
49 if (DbMonitorActive != value)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
50 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
51 DbMonitor = DbMonitor ?? new OracleMonitor();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
52 DbMonitor.IsActive = value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
53 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
54 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
55 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
56 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
57
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
58 public override IDbConnection CreateConnectionObject()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
59 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
60 return new OracleConnection();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
61 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
62
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
63 public override DbDataAdapter CreateDataAdapterObject()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
64 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
65 return new OracleDataAdapter();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
66 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
67
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
68 public override bool DeriveParameters(IDbCommand command)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
69 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
70 var oraCommand = command as OracleCommand;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
71
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
72 if (null != oraCommand)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
73 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
74 try
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
75 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
76 OracleCommandBuilder.DeriveParameters(oraCommand);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
77 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
78 catch (Exception ex)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
79 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
80 // Make Oracle less laconic.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
81 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
82 throw new DataException(string.Format("{0}\nCommandText: {1}", ex.Message, oraCommand.CommandText), ex);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
83 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
84
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
85 return true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
86 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
87
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
88 return false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
89 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
90
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
91 public override void AttachParameter(IDbCommand command, IDbDataParameter parameter)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
92 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
93 var value = parameter.Value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
94
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
95 if (value is DateTime)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
96 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
97 parameter.Value = new OracleTimeStamp((DateTime)value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
98 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
99 else if (value is Guid)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
100 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
101 parameter.Value = ((Guid)value).ToByteArray();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
102 parameter.DbType = DbType.Binary;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
103 ((OracleParameter)parameter).OracleDbType = OracleDbType.Raw;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
104 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
105 // else if (value is string)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
106 // {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
107 // ((OracleParameter)parameter).OracleDbType = OracleDbType.NVarChar;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
108 // }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
109
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
110 base.AttachParameter(command, parameter);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
111 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
112
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
113 public override int ExecuteArray(IDbCommand command, int iterations)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
114 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
115 var cmd = (OracleCommand)command;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
116 return cmd.ExecuteArray(iterations);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
117 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
118
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
119 public override ISqlProvider CreateSqlProvider()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
120 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
121 return new OracleSqlProvider();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
122 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
123
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
124
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
125 #region InsertBatch
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
126
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
127 public override int InsertBatch<T>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
128 DbManager db,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
129 string insertText,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
130 IEnumerable<T> collection,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
131 MemberMapper[] members,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
132 int maxBatchSize,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
133 DbManager.ParameterProvider<T> getParameters)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
134 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
135 var sb = new StringBuilder();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
136 var sp = new OracleSqlProvider();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
137 var n = 0;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
138 var cnt = 0;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
139 var str = "\t" + insertText
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
140 .Substring(0, insertText.IndexOf(") VALUES ("))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
141 .Substring(7)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
142 .Replace("\r", "")
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
143 .Replace("\n", "")
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
144 .Replace("\t", " ")
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
145 .Replace("( ", "(")
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
146 //.Replace(" ", " ")
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
147 + ") VALUES (";
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
148
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
149 foreach (var item in collection)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
150 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
151 if (sb.Length == 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
152 sb.AppendLine("INSERT ALL");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
153
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
154 sb.Append(str);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
155
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
156 foreach (var member in members)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
157 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
158 var value = member.GetValue(item);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
159
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
160 if (value is Nullable<DateTime>)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
161 value = ((DateTime?)value).Value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
162
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
163 if (value is DateTime)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
164 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
165 var dt = (DateTime)value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
166 sb.Append(string.Format("to_timestamp('{0:dd.MM.yyyy HH:mm:ss.ffffff}', 'DD.MM.YYYY HH24:MI:SS.FF6')", dt));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
167 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
168 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
169 sp.BuildValue(sb, value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
170
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
171 sb.Append(", ");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
172 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
173
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
174 sb.Length -= 2;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
175 sb.AppendLine(")");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
176
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
177 n++;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
178
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
179 if (n >= maxBatchSize)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
180 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
181 sb.AppendLine("SELECT * FROM dual");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
182
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
183 var sql = sb.ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
184
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
185 if (DbManager.TraceSwitch.TraceInfo)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
186 DbManager.WriteTraceLine("\n" + sql.Replace("\r", ""), DbManager.TraceSwitch.DisplayName);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
187
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
188 cnt += db.SetCommand(sql).ExecuteNonQuery();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
189
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
190 n = 0;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
191 sb.Length = 0;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
192 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
193 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
194
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
195 if (n > 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
196 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
197 sb.AppendLine("SELECT * FROM dual");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
198
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
199 var sql = sb.ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
200
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
201 if (DbManager.TraceSwitch.TraceInfo)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
202 DbManager.WriteTraceLine("\n" + sql.Replace("\r", ""), DbManager.TraceSwitch.DisplayName);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
203
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
204 cnt += db.SetCommand(sql).ExecuteNonQuery();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
205 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
206
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
207 return cnt;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
208 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
209
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
210 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
211 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
212 }