IBE.SQL.EliteDBIO.CopyEDStationCommodityToDataRow C# (CSharp) Method

CopyEDStationCommodityToDataRow() private method

copies the commodities data from a "EDStation"-object to "tb_______Commodity"-table
private CopyEDStationCommodityToDataRow ( EDStation StationObject, dsEliteDB Data, UInt32 &AutoIndex ) : void
StationObject IBE.EDDB_Data.EDStation
Data dsEliteDB
AutoIndex System.UInt32
return void
        private void CopyEDStationCommodityToDataRow(EDStation StationObject, dsEliteDB Data, ref UInt32 AutoIndex)
        {
            Int32 i;
            String[] currentCommodityCollection = null;
            String currentCommodityAttribute = null;

            try
            {
               
                var existingClassification      =  ((dsEliteDB.tbcommodityclassificationRow[])Data.tbcommodityclassification.Select("station_id = " + StationObject.Id)).ToList();
                var newCommodityClassification  = new Dictionary<String, List<String>>();

                // collect classification data
                for(i=0 ; i<=2 ; i++)
                {
                    switch (i)
                    {
                    	case 0:
                    		currentCommodityCollection  = StationObject.ImportCommodities;
                            currentCommodityAttribute   = "import";
                    		break;
                    	case 1:
                    		currentCommodityCollection  = StationObject.ExportCommodities;
                            currentCommodityAttribute   = "export";
                    		break;
                    	case 2:
                    		currentCommodityCollection  = StationObject.ProhibitedCommodities;
                            currentCommodityAttribute   = "prohibited";
                    		break;
                    }

                    foreach (var Commodity in currentCommodityCollection)
	                {
                        // cyxle throught the <Attribute>-commodities from the station
                        List<String> currentClassification;
		                if(!newCommodityClassification.TryGetValue(Commodity, out currentClassification))
                        {
                            // this commodity is not registered at all
                            var newCL = new List<String>() {currentCommodityAttribute};
                            newCommodityClassification.Add(Commodity, newCL);
                        }
                        else
                        {
                            // this commodity is already registered
                            if(!currentClassification.Contains(currentCommodityAttribute))
                            {
                                // but not yet for this classification
                                currentClassification.Add(currentCommodityAttribute);
                            }
                        }
	                }
                }

                // process classification data
                foreach (var Classification in newCommodityClassification)
                {
                    // get the current commodity id
                    Int32  CommodityID = (Int32)DBConvert.From(BaseTableNameToID("commodity", Classification.Key));
                    UInt32 CClassifID;

                    // and check, if the commodity is already added to station
                    var Found = from dsEliteDB.tbcommodityclassificationRow relevantCommodity in existingClassification
                                where  ((relevantCommodity.RowState      != DataRowState.Deleted) 
                                     && (relevantCommodity.commodity_id  == CommodityID))
                                select relevantCommodity;

                    // if it's not existing, insert commodity
                    if(Found.Count() == 0)
                    {
                        var newRow = (dsEliteDB.tbcommodityclassificationRow)Data.tbcommodityclassification.NewRow();

                        newRow.id           = AutoIndex;
                        newRow.station_id   = StationObject.Id;
                        newRow.commodity_id = CommodityID;

                        Data.tbcommodityclassification.Rows.Add(newRow);

                        CClassifID          = newRow.id;
                        AutoIndex          += 1;
                    }
                    else
                    {
                        // memorize the id and remove commodity from list to mark it as "found"
                        CClassifID = Found.First().id;
                        existingClassification.Remove(Found.First());
                        //Debug.Print("removed " + Classification.Key);
                    }

                    var existingAttributes    =  ((dsEliteDB.tbcommodity_has_attributeRow[])Data.tbcommodity_has_attribute.Select("tbcommodityclassification_id   = " + CClassifID)).ToList();

                    // now check the attributes for this commodity
                    foreach (var Attribute in Classification.Value)
                    {
                        // get the current attribute id
                        Int32 AttributeID = (Int32)DBConvert.From(BaseTableNameToID("attribute", Attribute));    

                        // and check, if the attribute is already added to classification
                        var FoundCC = from dsEliteDB.tbcommodity_has_attributeRow relevantCommodity in existingAttributes
                                    where   relevantCommodity.RowState        != DataRowState.Deleted
                                         && relevantCommodity.tbAttribute_id  == AttributeID
                                    select relevantCommodity;

                        // if it's not existing, insert attribute
                        if(FoundCC.Count() == 0)
                        {
                            var newRow = (dsEliteDB.tbcommodity_has_attributeRow)Data.tbcommodity_has_attribute.NewRow();

                            newRow.tbAttribute_id               = AttributeID;
                            newRow.tbCommodityClassification_id = CClassifID;

                            Data.tbcommodity_has_attribute.Rows.Add(newRow);
                        }
                        else
                        {
                            // remove attribute from list to mark it as "found"
                            existingAttributes.Remove(FoundCC.First());
                        }
                    }

                    // remove all old, not more existing attributes
                    foreach (DataRow RemovedRow in existingAttributes)
                        Data.tbcommodity_has_attribute.Rows.Remove(RemovedRow);    

                }

                // remove all old, not more existing classification
                foreach (DataRow RemovedRow in existingClassification)
                    Data.tbcommodityclassification.Rows.Remove(RemovedRow);    

            }
            catch (Exception ex)
            {
                throw new Exception("Error while copying station commodity data", ex);
            }
        }