Пример #1
0
        /// <summary>
        /// Executa uma procedure no banco de dados.
        /// </summary>
        /// <param name="action">Informação da ação de persistência.</param>
        /// <param name="transaction">Transação de persistência.</param>
        /// <returns>Retorna resultado da ação de persistência.</returns>
        protected override PersistenceActionResult ExecuteProcedureCommand(PersistenceAction action, IPersistenceTransactionExecuter transaction)
        {
            var        trans               = (PersistenceTransactionExecuter)transaction;
            DataAccess da                  = trans != null ? new DataAccess(trans.Transaction.ProviderConfiguration) : new DataAccess();
            var        indexes             = new List <int>();
            var        storedProcedureName = (Query.Database.TranslatedStoredProcedureName)Translator.GetName(action.StoredProcedureName);
            var        script              = "BEGIN " + (!string.IsNullOrEmpty(storedProcedureName.Schema) ? string.Format("\"{0}\".\"{1}\"", storedProcedureName.Schema, storedProcedureName.Name) : string.Format("\"{0}\"", storedProcedureName.Name)) + " (";

            for (var i = 1; i <= action.Parameters.Count; i++)
            {
                script += ":" + i + ",";
            }
            script = (action.Parameters.Count > 0 ? script.Substring(0, script.Length - 1) : script) + "); END;";
            var parameters = new GDA.Collections.GDAParameterCollection();

            for (int i = 0; i < action.Parameters.Count; i++)
            {
                var paramDirection = (System.Data.ParameterDirection)((int)action.Parameters[i].Direction);
                var value          = action.Parameters[i].Value;
                parameters.Add(CreateParameter(":" + (i + 1), value, action.Parameters[i].Size, paramDirection));
                if (action.Parameters[i].Direction != Query.ParameterDirection.Input)
                {
                    indexes.Add(i);
                }
            }
            var parameters2 = parameters.ToArray();
            var result      = da.ExecuteCommand(trans.Transaction, CommandType.Text, action.CommandTimeout, script, parameters2);

            foreach (int index in indexes)
            {
                action.Parameters[index].Value = parameters2[index].Value;
            }
            var presult = new PersistenceActionResult()
            {
                ActionId   = action.ActionId,
                Parameters = action.Parameters.ToArray(),
                Result     = result,
                Success    = true
            };

            return(presult);
        }
        /// <summary>
        /// Retorna o parâmetro correspondente a chave primária
        /// </summary>
        /// <param name="transaction"></param>
        /// <param name="entityName">Nome da entidade</param>
        /// <returns>Pâremetro correspondente a chave primária</returns>
        public object GetPrimaryKey(IPersistenceTransactionExecuter transaction, string entityName)
        {
            var metadata         = _typeSchema.GetTypeMetadata(entityName);
            var identityMetadata = metadata.GetKeyProperties().FirstOrDefault();

            using (var session = new GDASession(GDASettings.GetProviderConfiguration(ProviderName)))
            {
                DataAccess da         = session != null ? new DataAccess(session.ProviderConfiguration) : new DataAccess();
                var        indexes    = new List <int>();
                var        script     = "BEGIN \"CONTROL\".\"GETIDENTITY\"(:1,:2,:3,:4); END;";
                var        parameters = new GDA.Collections.GDAParameterCollection();
                parameters.Add(new GDAParameter(":1", metadata.TableName.Schema, System.Data.ParameterDirection.Input));
                parameters.Add(new GDAParameter(":2", metadata.TableName.Name, System.Data.ParameterDirection.Input));
                parameters.Add(new GDAParameter(":3", identityMetadata.ColumnName, System.Data.ParameterDirection.Input));
                var resultParameter = new GDAParameter(":4", null)
                {
                    DbType    = System.Data.DbType.Int32,
                    Direction = System.Data.ParameterDirection.Output
                };
                parameters.Add(resultParameter);
                da.ExecuteCommand(session, script, parameters.ToArray());
                return(resultParameter.Value);
            }
        }
        protected override QueryResult ExecuteStoredProcedure(GDASession a, QueryInfo b)
        {
            DataAccess c = a != null ? new DataAccess(a.ProviderConfiguration) : new DataAccess();
            var        d = new List <int> ();
            var        e = (TranslatedStoredProcedureName)Translator.GetName(b.StoredProcedureName);
            var        f = "BEGIN " + (!string.IsNullOrEmpty(e.Schema) ? string.Format("\"{0}\".\"{1}\"", e.Schema, e.Name) : string.Format("\"{0}\"", e.Name)) + " (";

            for (var g = 1; g <= b.Parameters.Count + 1; g++)
            {
                f += ":" + g + ",";
            }
            f = f.Substring(0, f.Length - 1) + "); END;";
            var h = new GDA.Collections.GDAParameterCollection();

            for (int g = 0; g < b.Parameters.Count; g++)
            {
                var i = (System.Data.ParameterDirection)((int)b.Parameters [g].Direction);
                h.Add(new GDAParameter(":" + (g + 1), b.Parameters [g].Value, i));
                if (b.Parameters [g].Direction != ParameterDirection.Input)
                {
                    d.Add(g);
                }
            }
                        #if DEVART
            // Cria o parametro é que referência do cursor
            var j = new GDAParameter(":" + (b.Parameters.Count + 1), null)
            {
                NativeDbType = Devart.Data.Oracle.OracleDbType.Cursor, Direction = System.Data.ParameterDirection.Output
            };
#else
            var j = new GDAParameter(":" + (b.Parameters.Count + 1), null)
            {
                DbType    = (System.Data.DbType) 13,
                Direction = System.Data.ParameterDirection.Output
            };
                        #endif
            h.Add(j);
            c.ExecuteCommand(a, System.Data.CommandType.Text, b.CommandTimeout, f, h.ToArray());
            IEnumerator <GDADataRecord> k = NavigateRefCursor(j).GetEnumerator();
            IEnumerable <Record>        l = null;
            Record.RecordDescriptor     m = null;
            foreach (int index in d)
            {
                b.Parameters [index].Value = h [index].Value;
            }
            try {
                if (k.MoveNext())
                {
                    var n = k.Current;
                    var o = new List <Record.Field> ();
                    for (int g = 0; g < n.FieldCount; g++)
                    {
                        var p = n [g].GetValue();
                        var q = n.GetName(g);
                        if (string.IsNullOrEmpty(q))
                        {
                            q = "return_value";
                        }
                        o.Add(new Record.Field(q, n.GetFieldType(g)));
                    }
                    m = new Record.RecordDescriptor("descriptor", o);
                    var r = GetRecord(m, n);
                    l = GetRecords(m, r, k);
                }
                else
                {
                    k.Dispose();
                    l = new Record[0];
                }
            }
            catch {
                k.Dispose();
                throw;
            }
            var s = new QueryResult(m, l, b, t => Execute(a, t));
            s.Validate().ThrowInvalid();
            return(s);
        }
Пример #4
0
        /// <summary>
        /// Recupera as propriedades volatéis.
        /// </summary>
        /// <param name="actions"></param>
        /// <param name="result"></param>
        /// <param name="transaction">Transação usada na execução.</param>
        protected override void RetrievePersistenceVolatileProperties(PersistenceAction[] actions, PersistenceActionResult[] result, IPersistenceTransactionExecuter transaction)
        {
            for (int actionIndex = 0; actionIndex < actions.Length; actionIndex++)
            {
                if (actions[actionIndex].Type == PersistenceActionType.Insert || actions[actionIndex].Type == PersistenceActionType.Update)
                {
                    var action             = actions[actionIndex];
                    var actionResult       = result[actionIndex];
                    var typeMetadata       = TypeSchema.GetTypeMetadata(action.EntityFullName);
                    var volatileProperties = typeMetadata.GetVolatileProperties().ToArray();
                    if (!typeMetadata.IsVersioned && volatileProperties.Length == 0)
                    {
                        continue;
                    }
                    var commandText = new StringBuilder();
                    var keysIndex   = new List <Tuple <int, IPropertyMetadata> >();
                    for (int i = 0; i < action.Parameters.Count; i++)
                    {
                        var propertyMetadata = typeMetadata[action.Parameters[i].Name];
                        if (propertyMetadata.ParameterType == Data.Schema.PersistenceParameterType.IdentityKey || propertyMetadata.ParameterType == Data.Schema.PersistenceParameterType.Key)
                        {
                            keysIndex.Add(new Tuple <int, IPropertyMetadata>(i, propertyMetadata));
                        }
                    }
                    if (keysIndex.Count == 0)
                    {
                        continue;
                    }
                    var  parameters = new GDA.Collections.GDAParameterCollection();
                    bool isFirst    = true;
                    commandText.Append("SELECT ");
                    var selectCommandText = new StringBuilder();
                    if (typeMetadata.IsVersioned)
                    {
                        selectCommandText.Append("CAST(ORA_ROWSCN AS NUMBER(18,0)) AS ").AppendFormat("\"{0}\"", Query.DataAccessConstants.RowVersionPropertyName);
                        isFirst = false;
                    }
                    foreach (var property in typeMetadata.GetVolatileProperties())
                    {
                        if (!isFirst)
                        {
                            selectCommandText.Append(", ");
                        }
                        isFirst = false;
                        if (typeMetadata.IsVersioned && property.Name == Query.DataAccessConstants.RowVersionPropertyName)
                        {
                            continue;
                        }
                        selectCommandText.AppendFormat("\"{0}\" AS \"{1}\"", property.ColumnName.ToUpper(), property.Name);
                    }
                    var tableNameTranslatedName = (Query.Database.TranslatedTableName)Translator.GetName(new EntityInfo(action.EntityFullName));
                    isFirst = true;
                    commandText.Append(selectCommandText).Append(" FROM ").AppendFormat("\"{0}\".\"{1}\"", tableNameTranslatedName.Schema, tableNameTranslatedName.Name).Append(" WHERE ");
                    var paramaterCount = 1;
                    foreach (var i in keysIndex)
                    {
                        if (!isFirst)
                        {
                            commandText.Append(" AND ");
                        }
                        isFirst = false;
                        var whereParameter = new GDA.GDAParameter("?" + (paramaterCount++), action.Parameters[i.Item1].Value);
                        parameters.Add(whereParameter);
                        commandText.AppendFormat("\"{0}\"", i.Item2.ColumnName.ToUpper()).Append("=").Append(whereParameter.ParameterName);
                    }
                    var transaction2     = (PersistenceTransactionExecuter)transaction;
                    var da               = new DataAccess(transaction2.Transaction.ProviderConfiguration);
                    var resultParameters = new List <PersistenceParameter>();
                    using (var enumerator = da.LoadResult(transaction2.Transaction, commandText.ToString(), parameters.ToArray()).GetEnumerator())
                    {
                        if (enumerator.MoveNext())
                        {
                            var record = enumerator.Current;
                            for (var i = 0; i < record.FieldCount; i++)
                            {
                                var    parameterName = record.GetName(i);
                                object value         = null;
                                if (record.BaseDataRecord.GetDataTypeName(i) == "TimeStampTZ")
                                {
                                                                        #if UNMANAGED
                                    // Recupera o valor do Oracle
                                    var oracleTimeStampTZ = ((global::Oracle.DataAccess.Client.OracleDataReader)record.BaseDataRecord)
                                                            .GetOracleTimeStampTZ(i);
#else
                                    var oracleTimeStampTZ = ((global::Oracle.ManagedDataAccess.Client.OracleDataReader)record.BaseDataRecord).GetOracleTimeStampTZ(i);
                                                                        #endif
                                    value = new DateTimeOffset((DateTime)oracleTimeStampTZ, TimeSpan.Parse(oracleTimeStampTZ.TimeZone == "+00:00" ? "00:00" : oracleTimeStampTZ.TimeZone));
                                }
                                else
                                {
                                    value = record.GetValue(i);
                                }
                                resultParameters.Add(new PersistenceParameter(parameterName, value));
                                if (typeMetadata.IsVersioned && StringComparer.InvariantCultureIgnoreCase.Equals(Query.DataAccessConstants.RowVersionPropertyName, parameterName))
                                {
                                    try
                                    {
                                        if (value is DBNull || value == null)
                                        {
                                            actionResult.RowVersion = 0;
                                        }
                                        else
                                        {
                                            actionResult.RowVersion = Convert.ToInt64(value);
                                        }
                                    }
                                    catch
                                    {
                                    }
                                }
                            }
                        }
                    }
                    if (actionResult.Parameters != null)
                    {
                        foreach (var i in actionResult.Parameters)
                        {
                            if (!resultParameters.Any(f => StringComparer.InvariantCultureIgnoreCase.Equals(f.Name, i.Name)))
                            {
                                resultParameters.Add(i);
                            }
                        }
                    }
                    actionResult.Parameters = resultParameters.ToArray();
                }
            }
        }
        protected override QueryResult ExecuteStoredProcedure(GDASession session, QueryInfo queryInfo)
        {
            DataAccess da                  = session != null ? new DataAccess(session.ProviderConfiguration) : new DataAccess();
            var        indexes             = new List <int>();
            var        storedProcedureName = (TranslatedStoredProcedureName)Translator.GetName(queryInfo.StoredProcedureName);
            var        script              = "BEGIN " + (!string.IsNullOrEmpty(storedProcedureName.Schema) ? string.Format("\"{0}\".\"{1}\"", storedProcedureName.Schema, storedProcedureName.Name) : string.Format("\"{0}\"", storedProcedureName.Name)) + " (";

            for (var i = 1; i <= queryInfo.Parameters.Count + 1; i++)
            {
                script += ":" + i + ",";
            }
            script = script.Substring(0, script.Length - 1) + "); END;";
            var parameters = new GDA.Collections.GDAParameterCollection();

            for (int i = 0; i < queryInfo.Parameters.Count; i++)
            {
                var paramDirection = (System.Data.ParameterDirection)((int)queryInfo.Parameters[i].Direction);
                parameters.Add(new GDAParameter(":" + (i + 1), queryInfo.Parameters[i].Value, paramDirection));
                if (queryInfo.Parameters[i].Direction != ParameterDirection.Input)
                {
                    indexes.Add(i);
                }
            }
                        #if DEVART
            // Cria o parametro é que referência do cursor
            var refCursorParameter = new GDAParameter(":" + (queryInfo.Parameters.Count + 1), null)
            {
                NativeDbType = Devart.Data.Oracle.OracleDbType.Cursor, Direction = System.Data.ParameterDirection.Output
            };
#else
            var refCursorParameter = new GDAParameter(":" + (queryInfo.Parameters.Count + 1), null)
            {
                DbType    = (System.Data.DbType) 13,
                Direction = System.Data.ParameterDirection.Output
            };
                        #endif
            parameters.Add(refCursorParameter);
            da.ExecuteCommand(session, System.Data.CommandType.Text, queryInfo.CommandTimeout, script, parameters.ToArray());
            IEnumerator <GDADataRecord> dataRecordEnumerator = NavigateRefCursor(refCursorParameter).GetEnumerator();
            IEnumerable <Record>        records    = null;
            Record.RecordDescriptor     descriptor = null;
            foreach (int index in indexes)
            {
                queryInfo.Parameters[index].Value = parameters[index].Value;
            }
            try
            {
                if (dataRecordEnumerator.MoveNext())
                {
                    var dataRecord = dataRecordEnumerator.Current;
                    var fields     = new List <Record.Field>();
                    for (int i = 0; i < dataRecord.FieldCount; i++)
                    {
                        var value = dataRecord[i].GetValue();
                        var name  = dataRecord.GetName(i);
                        if (string.IsNullOrEmpty(name))
                        {
                            name = "return_value";
                        }
                        fields.Add(new Record.Field(name, dataRecord.GetFieldType(i)));
                    }
                    descriptor = new Record.RecordDescriptor("descriptor", fields);
                    var firstRecord = GetRecord(descriptor, dataRecord);
                    records = GetRecords(descriptor, firstRecord, dataRecordEnumerator);
                }
                else
                {
                    dataRecordEnumerator.Dispose();
                    records = new Record[0];
                }
            }
            catch
            {
                dataRecordEnumerator.Dispose();
                throw;
            }
            var result = new QueryResult(descriptor, records, queryInfo, f => Execute(session, f));
            result.Validate().ThrowInvalid();
            return(result);
        }