/// <summary> /// See comments in <see cref="UpdateCommand" />. /// </summary> internal override long Execute( Dictionary <int, object> identifierValues, List <KeyValuePair <PropagatorResult, object> > generatedValues, IDbCommandInterceptor commandInterceptor) { var connection = Translator.Connection; // configure command to use the connection and transaction for this session _dbCommand.Transaction = ((null == connection.CurrentTransaction) ? null : connection.CurrentTransaction.StoreTransaction); _dbCommand.Connection = connection.StoreConnection; if (Translator.CommandTimeout.HasValue) { _dbCommand.CommandTimeout = Translator.CommandTimeout.Value; } SetInputIdentifiers(identifierValues); // Execute the query long rowsAffected; if (null != ResultColumns) { // If there are result columns, read the server gen results rowsAffected = 0; var members = TypeHelpers.GetAllStructuralMembers(CurrentValues.StructuralType); using (var reader = _dbCommand.ExecuteReader(CommandBehavior.SequentialAccess)) { // Retrieve only the first row from the first result set if (reader.Read()) { rowsAffected++; foreach (var resultColumn in ResultColumns .Select(r => new KeyValuePair <int, PropagatorResult>(GetColumnOrdinal(Translator, reader, r.Key), r.Value)) .OrderBy(r => r.Key)) // order by column ordinal to avoid breaking SequentialAccess readers { var columnOrdinal = resultColumn.Key; var columnType = members[resultColumn.Value.RecordOrdinal].TypeUsage; object value; if (Helper.IsSpatialType(columnType) && !reader.IsDBNull(columnOrdinal)) { value = SpatialHelpers.GetSpatialValue(Translator.MetadataWorkspace, reader, columnType, columnOrdinal); } else { value = reader.GetValue(columnOrdinal); } // register for back-propagation var result = resultColumn.Value; generatedValues.Add(new KeyValuePair <PropagatorResult, object>(result, value)); // register identifier if it exists var identifier = result.Identifier; if (PropagatorResult.NullIdentifier != identifier) { identifierValues.Add(identifier, value); } } } // Consume the current reader (and subsequent result sets) so that any errors // executing the function can be intercepted CommandHelper.ConsumeReader(reader); } } else { rowsAffected = _dbCommand.ExecuteNonQuery(); } return(GetRowsAffected(rowsAffected, Translator)); }
// <summary> // See comments in <see cref="UpdateCommand" />. // </summary> internal override long Execute( Dictionary <int, object> identifierValues, List <KeyValuePair <PropagatorResult, object> > generatedValues) { // Compile command using (var command = CreateCommand(identifierValues)) { var connection = Translator.Connection; // configure command to use the connection and transaction for this session command.Transaction = ((null == connection.CurrentTransaction) ? null : connection.CurrentTransaction.StoreTransaction); command.Connection = connection.StoreConnection; if (Translator.CommandTimeout.HasValue) { command.CommandTimeout = Translator.CommandTimeout.Value; } // Execute the query int rowsAffected; if (_modificationCommandTree.HasReader) { // retrieve server gen results rowsAffected = 0; using (var reader = command.ExecuteReader(CommandBehavior.SequentialAccess)) { if (reader.Read()) { rowsAffected++; var members = TypeHelpers.GetAllStructuralMembers(CurrentValues.StructuralType); for (var ordinal = 0; ordinal < reader.FieldCount; ordinal++) { // column name of result corresponds to column name of table var columnName = reader.GetName(ordinal); var member = members[columnName]; object value; if (Helper.IsSpatialType(member.TypeUsage) && !reader.IsDBNull(ordinal)) { value = SpatialHelpers.GetSpatialValue(Translator.MetadataWorkspace, reader, member.TypeUsage, ordinal); } else { value = reader.GetValue(ordinal); } // retrieve result which includes the context for back-propagation var columnOrdinal = members.IndexOf(member); var result = CurrentValues.GetMemberValue(columnOrdinal); // register for back-propagation generatedValues.Add(new KeyValuePair <PropagatorResult, object>(result, value)); // register identifier if it exists var identifier = result.Identifier; if (PropagatorResult.NullIdentifier != identifier) { identifierValues.Add(identifier, value); } } } // Consume the current reader (and subsequent result sets) so that any errors // executing the command can be intercepted CommandHelper.ConsumeReader(reader); } } else { rowsAffected = command.ExecuteNonQuery(); } return(rowsAffected); } }
internal override long Execute( Dictionary <int, object> identifierValues, List <KeyValuePair <PropagatorResult, object> > generatedValues) { using (DbCommand command = this.CreateCommand(identifierValues)) { EntityConnection connection = this.Translator.Connection; command.Transaction = connection.CurrentTransaction == null ? (DbTransaction)null : connection.CurrentTransaction.StoreTransaction; command.Connection = connection.StoreConnection; if (this.Translator.CommandTimeout.HasValue) { command.CommandTimeout = this.Translator.CommandTimeout.Value; } int num; if (this._modificationCommandTree.HasReader) { num = 0; using (DbDataReader reader = command.ExecuteReader(CommandBehavior.SequentialAccess)) { if (reader.Read()) { ++num; IBaseList <EdmMember> structuralMembers = TypeHelpers.GetAllStructuralMembers((EdmType)this.CurrentValues.StructuralType); for (int index = 0; index < reader.FieldCount; ++index) { string name = reader.GetName(index); EdmMember edmMember = structuralMembers[name]; object obj = !Helper.IsSpatialType(edmMember.TypeUsage) || reader.IsDBNull(index) ? reader.GetValue(index) : SpatialHelpers.GetSpatialValue(this.Translator.MetadataWorkspace, reader, edmMember.TypeUsage, index); PropagatorResult memberValue = this.CurrentValues.GetMemberValue(structuralMembers.IndexOf(edmMember)); generatedValues.Add(new KeyValuePair <PropagatorResult, object>(memberValue, obj)); int identifier = memberValue.Identifier; if (-1 != identifier) { identifierValues.Add(identifier, obj); } } } CommandHelper.ConsumeReader(reader); } } else { num = command.ExecuteNonQuery(); } return((long)num); } }
// efects: Executes the current function command in the given transaction and connection context. // All server-generated values are added to the generatedValues list. If those values are identifiers, they are // also added to the identifierValues dictionary, which associates proxy identifiers for keys in the session // with their actual values, permitting fix-up of identifiers across relationships. internal override long Execute(UpdateTranslator translator, EntityConnection connection, Dictionary <int, object> identifierValues, List <KeyValuePair <PropagatorResult, object> > generatedValues) { // configure command to use the connection and transaction for this session m_dbCommand.Transaction = ((null != connection.CurrentTransaction) ? connection.CurrentTransaction.StoreTransaction : null); m_dbCommand.Connection = connection.StoreConnection; if (translator.CommandTimeout.HasValue) { m_dbCommand.CommandTimeout = translator.CommandTimeout.Value; } // set all identifier inputs (to support propagation of identifier values across relationship // boundaries) if (null != m_inputIdentifiers) { foreach (KeyValuePair <int, DbParameter> inputIdentifier in m_inputIdentifiers) { object value; if (identifierValues.TryGetValue(inputIdentifier.Key, out value)) { // set the actual value for the identifier if it has been produced by some // other command inputIdentifier.Value.Value = value; } } } // Execute the query long rowsAffected; if (null != m_resultColumns) { // If there are result columns, read the server gen results rowsAffected = 0; IBaseList <EdmMember> members = TypeHelpers.GetAllStructuralMembers(this.CurrentValues.StructuralType); using (DbDataReader reader = m_dbCommand.ExecuteReader(CommandBehavior.SequentialAccess)) { // Retrieve only the first row from the first result set if (reader.Read()) { rowsAffected++; foreach (var resultColumn in m_resultColumns .Select(r => new KeyValuePair <int, PropagatorResult>(GetColumnOrdinal(translator, reader, r.Key), r.Value)) .OrderBy(r => r.Key)) // order by column ordinal to avoid breaking SequentialAccess readers { int columnOrdinal = resultColumn.Key; TypeUsage columnType = members[resultColumn.Value.RecordOrdinal].TypeUsage; object value; if (Helper.IsSpatialType(columnType) && !reader.IsDBNull(columnOrdinal)) { value = SpatialHelpers.GetSpatialValue(translator.MetadataWorkspace, reader, columnType, columnOrdinal); } else { value = reader.GetValue(columnOrdinal); } // register for back-propagation PropagatorResult result = resultColumn.Value; generatedValues.Add(new KeyValuePair <PropagatorResult, object>(result, value)); // register identifier if it exists int identifier = result.Identifier; if (PropagatorResult.NullIdentifier != identifier) { identifierValues.Add(identifier, value); } } } // Consume the current reader (and subsequent result sets) so that any errors // executing the function can be intercepted CommandHelper.ConsumeReader(reader); } } else { rowsAffected = m_dbCommand.ExecuteNonQuery(); } // if an explicit rows affected parameter exists, use this value instead if (null != m_rowsAffectedParameter) { // by design, negative row counts indicate failure iff. an explicit rows // affected parameter is used if (DBNull.Value.Equals(m_rowsAffectedParameter.Value)) { rowsAffected = 0; } else { try { rowsAffected = Convert.ToInt64(m_rowsAffectedParameter.Value, CultureInfo.InvariantCulture); } catch (Exception e) { if (UpdateTranslator.RequiresContext(e)) { // wrap the exception throw EntityUtil.Update(System.Data.Entity.Strings.Update_UnableToConvertRowsAffectedParameterToInt32( m_rowsAffectedParameter.ParameterName, typeof(int).FullName), e, this.GetStateEntries(translator)); } throw; } } } return(rowsAffected); }