Mercurial > pub > bltoolkit
diff DataProviders/DevartOraclePro/DevartOracleDataProvider.cs @ 0:f990fcb411a9
Копия текущей версии из github
author | cin |
---|---|
date | Thu, 27 Mar 2014 21:46:09 +0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DataProviders/DevartOraclePro/DevartOracleDataProvider.cs Thu Mar 27 21:46:09 2014 +0400 @@ -0,0 +1,212 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.Common; +using System.Text; + +using BLToolkit.Data.Sql.SqlProvider; +using BLToolkit.Mapping; + +using Devart.Data.Oracle; + +namespace BLToolkit.Data.DataProvider +{ + public class DevartOracleDataProvider : DataProviderBase + { + /// <summary> + /// Data provider name string. + /// </summary> + public const string NameString = "DevartOracle"; + + public override Type ConnectionType + { + get { return typeof(OracleConnection); } + } + + public override string Name + { + get { return NameString; } + } + + /// <summary> + /// Gets or sets the database activity monitor. + /// </summary> + private static Devart.Common.DbMonitor DbMonitor { get; set; } + + /// <summary> + /// Gets or sets value indicating whether the database activity monitor is enabled. + /// </summary> + /// <remarks> + /// This feature requires Standard or Pro edition of Devart dotConnect for Oracle provider. + /// </remarks> + public static bool DbMonitorActive + { + get { return DbMonitor == null ? false : DbMonitor.IsActive; } + set + { + // setting this property has no effect in Express edition +#if DEVART_PRO + if (DbMonitorActive != value) + { + DbMonitor = DbMonitor ?? new OracleMonitor(); + DbMonitor.IsActive = value; + } +#endif + } + } + + public override IDbConnection CreateConnectionObject() + { + return new OracleConnection(); + } + + public override DbDataAdapter CreateDataAdapterObject() + { + return new OracleDataAdapter(); + } + + public override bool DeriveParameters(IDbCommand command) + { + var oraCommand = command as OracleCommand; + + if (null != oraCommand) + { + try + { + OracleCommandBuilder.DeriveParameters(oraCommand); + } + catch (Exception ex) + { + // Make Oracle less laconic. + // + throw new DataException(string.Format("{0}\nCommandText: {1}", ex.Message, oraCommand.CommandText), ex); + } + + return true; + } + + return false; + } + + public override void AttachParameter(IDbCommand command, IDbDataParameter parameter) + { + var value = parameter.Value; + + if (value is DateTime) + { + parameter.Value = new OracleTimeStamp((DateTime)value); + } + else if (value is Guid) + { + parameter.Value = ((Guid)value).ToByteArray(); + parameter.DbType = DbType.Binary; + ((OracleParameter)parameter).OracleDbType = OracleDbType.Raw; + } +// else if (value is string) +// { +// ((OracleParameter)parameter).OracleDbType = OracleDbType.NVarChar; +// } + + base.AttachParameter(command, parameter); + } + + public override int ExecuteArray(IDbCommand command, int iterations) + { + var cmd = (OracleCommand)command; + return cmd.ExecuteArray(iterations); + } + + public override ISqlProvider CreateSqlProvider() + { + return new OracleSqlProvider(); + } + + + #region InsertBatch + + public override int InsertBatch<T>( + DbManager db, + string insertText, + IEnumerable<T> collection, + MemberMapper[] members, + int maxBatchSize, + DbManager.ParameterProvider<T> getParameters) + { + var sb = new StringBuilder(); + var sp = new OracleSqlProvider(); + var n = 0; + var cnt = 0; + var str = "\t" + insertText + .Substring(0, insertText.IndexOf(") VALUES (")) + .Substring(7) + .Replace("\r", "") + .Replace("\n", "") + .Replace("\t", " ") + .Replace("( ", "(") + //.Replace(" ", " ") + + ") VALUES ("; + + foreach (var item in collection) + { + if (sb.Length == 0) + sb.AppendLine("INSERT ALL"); + + sb.Append(str); + + foreach (var member in members) + { + var value = member.GetValue(item); + + if (value is Nullable<DateTime>) + value = ((DateTime?)value).Value; + + if (value is DateTime) + { + var dt = (DateTime)value; + sb.Append(string.Format("to_timestamp('{0:dd.MM.yyyy HH:mm:ss.ffffff}', 'DD.MM.YYYY HH24:MI:SS.FF6')", dt)); + } + else + sp.BuildValue(sb, value); + + sb.Append(", "); + } + + sb.Length -= 2; + sb.AppendLine(")"); + + n++; + + if (n >= maxBatchSize) + { + sb.AppendLine("SELECT * FROM dual"); + + var sql = sb.ToString(); + + if (DbManager.TraceSwitch.TraceInfo) + DbManager.WriteTraceLine("\n" + sql.Replace("\r", ""), DbManager.TraceSwitch.DisplayName); + + cnt += db.SetCommand(sql).ExecuteNonQuery(); + + n = 0; + sb.Length = 0; + } + } + + if (n > 0) + { + sb.AppendLine("SELECT * FROM dual"); + + var sql = sb.ToString(); + + if (DbManager.TraceSwitch.TraceInfo) + DbManager.WriteTraceLine("\n" + sql.Replace("\r", ""), DbManager.TraceSwitch.DisplayName); + + cnt += db.SetCommand(sql).ExecuteNonQuery(); + } + + return cnt; + } + + #endregion + } +}