Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

अज्ञात संख्या में स्तंभों के साथ बच्चे/अभिभावक डेटा को समतल करें

कई दिनों तक इस पर काम करने के बाद मैं खुद इस मुद्दे को सुलझाने में कामयाब रहा हूं। मैंने जो किया वह निम्नलिखित था;

मेरे मूल बाल वर्ग में सदस्य कोड और एलिमेंटकोड एक अनूठी कुंजी बनाते हैं जो मूल रूप से कॉलम नाम क्या था। इसलिए मैंने इसे एक कदम आगे बढ़ाया और एक "Column_Name" जोड़ा ताकि मेरे पास

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; }
}

यह स्पष्ट रूप से मेरी डेटाबेस तालिका में भी परिलक्षित होता था।

डेटा निकालने के लिए मेरा SQL तब इस तरह दिखता था;

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

रिकॉर्ड बाद में प्रसंस्करण के लिए सही क्रम में हैं यह सुनिश्चित करने के लिए पहले UniqueID द्वारा आदेश देना महत्वपूर्ण है।

मैं एक dynamic का उपयोग करूंगा और एक ExpandoObject() डेटा स्टोर करने के लिए।

इसलिए मैं परिणाम पर पुनरावृति करता हूं ताकि एसक्यूएल परिणाम को इस संरचना में निम्नानुसार परिवर्तित किया जा सके;

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

तब मेरे पास मेरी जानकारी गतिशील रूप से उस फ्लैट तरीके से संग्रहीत होती है जिसकी मुझे आवश्यकता होती है।

अब अगली समस्या ObjectListView थी जिसका मैं उपयोग करना चाहता था। यह ऐसे गतिशील प्रकारों को स्वीकार नहीं कर सका।

इसलिए मेरे पास मेरे कोड में जानकारी संग्रहीत थी जैसा मैं चाहता था, लेकिन मैं अभी भी इसे आवश्यकतानुसार प्रदर्शित नहीं कर सका।

इसका समाधान यह था कि ObjectListView . के एक प्रकार का उपयोग किया जाए DataListView . के रूप में जाना जाता है . यह प्रभावी रूप से वही नियंत्रण है लेकिन डेटा बाध्य हो सकता है। एक अन्य विकल्प डेटाग्रिड व्यू का उपयोग करना भी होगा, लेकिन मैं अन्य कारणों से ऑब्जेक्टलिस्ट व्यू से चिपकना चाहता था।

तो अब मुझे अपने डायनामिक डेटा को डेटासोर्स में बदलना पड़ा। यह मैंने इस प्रकार किया;

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);
}

फिर मैं बस अपने डेटा स्रोत को DataListView को असाइन करता हूं, कॉलम जेनरेट करता हूं, और हे प्रतिष्ठा अब मेरे पास मेरा गतिशील डेटा निकाला गया है, चपटा हुआ है और मुझे इसकी आवश्यकता है।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. कई मदों के लिए डुप्लीकेट कुंजी अद्यतन पर सम्मिलित करें .

  2. बहुत बड़ी SQL फ़ाइलें (MySQL) आयात करते समय एकल प्रतिबद्ध

  3. एसक्यूएल दिनांक प्रारूप कन्वर्ट? [दिनांक मिमी.वर्ष से वर्ष-माह-दिन तक]

  4. Wordpress साइट को डॉकर में ले जाना:DB कनेक्शन स्थापित करने में त्रुटि

  5. SOLR-डेल्टा आयात काम नहीं कर रहा है लेकिन पूर्ण आयात ठीक काम कर रहा है