sql >> Database teknologi >  >> RDS >> Mysql

Flader underordnede/forældredata med ukendt antal kolonner

Efter mange dages arbejde med dette, så har jeg formået at løse dette problem selv. Det jeg gjorde var følgende;

I min oprindelige børneklasse laver MemberCode og ElementCode en unik nøgle, der grundlæggende stod, hvad kolonnenavnet var. Så jeg tog dette et skridt videre og tilføjede et "Column_Name", så jeg havde

public class Child
{
        public int MemberCode { get; set; }   //Composite key
        public int ElementCode { get; set; }  //Composite key
        public string Column_Name { get; set; }  //Unique.  Alternative Key
        public Object Data { get; set; }
}

Dette afspejlede sig naturligvis også i min databasetabel.

Min SQL til at udtrække dataene så således ud;

select  p.UniqueID, p.LoadTime, p.reference, c.MemberCode, c.ElementCode , c.column_name, c.Data 
from parent as p, child as c
where p.UniqueID = c.UniqueID 
//aditional filter criteria
ORDER BY p.UniqueID, MemberCode, ElementCode

bestilling efter UniqueID først er afgørende for at sikre, at posterne er i den rigtige rækkefølge til senere behandling.

Jeg ville bruge en dynamic og et ExpandoObject() at gemme dataene.

Så jeg gentager resultatet for at konvertere sql-resultatet til denne struktur som følger;

List<dynamic> allRecords = new List<dynamic>();  //A list of all my records
List<dynamic> singleRecord = null;  //A list representing just a single record

bool first = true;   //Needed for execution of the first iteration only
int lastId = 0;      //id of the last unique record

foreach (DataRow row in args.GetDataSet.Tables[0].Rows)
{
    int newID = Convert.ToInt32(row["UniqueID"]);  //get the current record unique id   

    if (newID != lastId)  //If new record then get header/parent information
    {
        if (!first)
            allRecords.Add(singleRecord);   //store the last record
        else
            first = false;

        //new object
        singleRecord = new List<dynamic>();

        //get parent information and store it
        dynamic head = new ExpandoObject();
        head.Column_name = "UniqueID";
        head.UDS_Data = row["UniqueID"].ToString();
        singleRecord.Add(head);

        head = new ExpandoObject();
        head.Column_name = "LoadTime";
        head.UDS_Data = row["LoadTime"].ToString();
        singleRecord.Add(head);

        head = new ExpandoObject();
        head.Column_name = "reference";
        head.UDS_Data = row["reference"].ToString();
        singleRecord.Add(head);                    
    }

    //get child information and store it.  One row at a time
    dynamic record = new ExpandoObject();

    record.Column_name = row["column_name"].ToString();
    record.UDS_Data = row["data"].ToString();
    singleRecord.Add(record);

    lastId = newID;   //store the last id
}
allRecords.Add(singleRecord);  //stores the last complete record

Så har jeg gemt mine oplysninger dynamisk på den flade måde, som jeg havde brug for.

Nu var det næste problem den ObjectListView, jeg ville bruge. Dette kunne ikke acceptere sådanne dynamiske typer.

Så jeg havde oplysningerne gemt i min kode, som jeg ønskede, men jeg kunne stadig ikke vise dem, som det var påkrævet.

Løsningen var at bruge en variant af ObjectListView kendt som DataListView . Dette er faktisk den samme kontrol, men kan være databundet. Et andet alternativ ville også være at bruge en DatagridView, men jeg ønskede at holde mig til ObjectListView af andre årsager.

Så nu skulle jeg konvertere mine dynamiske data til en datakilde. Dette gjorde jeg som følger;

DataTable dt = new DataTable();            
foreach (dynamic record in allRecords)
{
    DataRow dr = dt.NewRow();
    foreach (dynamic item in record)
    {
        var prop = (IDictionary<String, Object>)item;
        if (!dt.Columns.Contains(prop["Column_name"].ToString()))
        {
            dt.Columns.Add(new DataColumn(prop["Column_name"].ToString()));
        }

        dr[prop["Column_name"].ToString()] = prop["UDS_Data"];
    }
    dt.Rows.Add(dr);
}

Så tildeler jeg simpelthen min datakilde til DataListView, genererer kolonnerne, og hey presto, jeg har nu mine dynamiske data udtrukket, fladtrykt og vist, hvordan jeg har brug for det.




  1. Mysql connect i to tabeller

  2. MySQL-koncepter:session vs forbindelse

  3. drupal views modul mysql fejl

  4. Slet mange rækker fra en tabel ved hjælp af id i Mysql