/// <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); }
/// <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); }