// o argumento isParentOptional indica se deverão ser devolvidas apenas as rows // cuja FK é nullable ou se deverão ser devolvidas apenas aquelas em que a FK é // não nullable public override ConcorrenciaRule.ChildRelationRows getChildRowsFromDB(DataSet data, DataTable table, ArrayList parentRows, IDbTransaction tran) { ChildRelationRows result = new ChildRelationRows(new ArrayList(), new ArrayList()); DataTable childTable; StringBuilder genericChildsFilter = new StringBuilder(); string childsFilter = string.Empty; foreach (DataRelation childRelation in table.ChildRelations) { DataColumn[] parentColumns; DataColumn[] childColumns; parentColumns = childRelation.ChildKeyConstraint.RelatedColumns; childColumns = childRelation.ChildKeyConstraint.Columns; for (int i = 0; i <= childColumns.Length - 1; i++) { if (genericChildsFilter.Length > 0) { genericChildsFilter.Append(" AND "); } genericChildsFilter.AppendFormat("{0}={1}", childColumns[i].ColumnName, "{" + i.ToString() + "}"); } foreach (DataRow parentRow in parentRows) { ArrayList relationParentValues = new ArrayList(); for (int i = 0; i <= parentColumns.Length - 1; i++) { DataColumn parentColumn = parentColumns[i]; // as parentRow podem pertencer ao dataset de trabalho ou aos dados que estamos agora a recolher da BD. Apenas no 1º caso o rowstate será deleted. if (parentRow.RowState == DataRowState.Deleted) { relationParentValues.Add(parentRow[parentColumn.ColumnName, DataRowVersion.Original]); } else { relationParentValues.Add(parentRow[parentColumn.ColumnName]); } } childsFilter = string.Format("WHERE " + genericChildsFilter.ToString(), relationParentValues.ToArray()); childTable = new DataTable(childRelation.ChildTable.TableName); using (var command = SqlSyntax.CreateSelectCommandWithNoDeletedRowsParam((SqlTransaction)tran)) using (var da = new SqlDataAdapter(command)) { da.SelectCommand.CommandText = SqlSyntax.CreateSelectCommandText(childRelation.ChildTable, childsFilter); da.Fill(childTable); } result.tables.Add(childTable); result.relationColumns.Add(childColumns); } genericChildsFilter = new StringBuilder(); childsFilter = string.Empty; } return(result); }
// o argumento isParentOptional indica se deverão ser devolvidas apenas as rows // cuja FK é nullable ou se deverão ser devolvidas apenas aquelas em que a FK é // não nullable public override ConcorrenciaRule.ChildRelationRows getChildRowsFromDB(DataSet data, DataTable table, ArrayList parentRows, IDbTransaction tran) { ChildRelationRows result = new ChildRelationRows(new ArrayList(), new ArrayList()); DataTable childTable; StringBuilder genericChildsFilter = new StringBuilder(); string childsFilter = string.Empty; foreach (DataRelation childRelation in table.ChildRelations) { DataColumn[] parentColumns; DataColumn[] childColumns; parentColumns = childRelation.ChildKeyConstraint.RelatedColumns; childColumns = childRelation.ChildKeyConstraint.Columns; for (int i = 0; i <= childColumns.Length - 1; i++) { if (genericChildsFilter.Length > 0) genericChildsFilter.Append(" AND "); genericChildsFilter.AppendFormat("{0}={1}", childColumns[i].ColumnName, "{" + i.ToString() + "}"); } foreach (DataRow parentRow in parentRows) { ArrayList relationParentValues = new ArrayList(); for (int i = 0; i <= parentColumns.Length - 1; i++) { DataColumn parentColumn = parentColumns[i]; // as parentRow podem pertencer ao dataset de trabalho ou aos dados que estamos agora a recolher da BD. Apenas no 1º caso o rowstate será deleted. if (parentRow.RowState == DataRowState.Deleted) relationParentValues.Add(parentRow[parentColumn.ColumnName, DataRowVersion.Original]); else relationParentValues.Add(parentRow[parentColumn.ColumnName]); } childsFilter = string.Format("WHERE " + genericChildsFilter.ToString(), relationParentValues.ToArray()); childTable = new DataTable(childRelation.ChildTable.TableName); using (var command = SqlSyntax.CreateSelectCommandWithNoDeletedRowsParam((SqlTransaction)tran)) using (var da = new SqlDataAdapter(command)) { da.SelectCommand.CommandText = SqlSyntax.CreateSelectCommandText(childRelation.ChildTable, childsFilter); da.Fill(childTable); } result.tables.Add(childTable); result.relationColumns.Add(childColumns); } genericChildsFilter = new StringBuilder(); childsFilter = string.Empty; } return result; }