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