// 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);
        }
Ejemplo n.º 2
0
		// 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;
		}