[C#] Ładowanie danych z XML do DataTable.

0

Witam !
moja aplikacja pobiera dane z dwóch źródeł (plik XML i baza danych) i ładuje je wszystkie to jednej tabeli w DataSecie. Kiedy binduje DataTable z DataGridem żeby sprawdzić czy dane załadowały się poprawnie, dane pobrane XML`a są porozrzucane po wierszach.

(jak na razie w pliku XML i w bazie mam po jednym rekordzie)
user image

Domyślam się ,że problem może tkwić w sposobie w jaki ładuję dane z XML`a do tabeli ale nie wiem jak to naprawić. Proszę o wskazówki.

protected void Page_Load(object sender, EventArgs e)
    {
        //creating connection string
        SqlConnection conn = new SqlConnection(@"server = .\sqlexpress; integrated security = true; database = BetterHomes");

        try
        {
            conn.Open();

            // creating command and assigning connection and stored procedure
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = conn;
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = "DisplayProperties";

            //creating data adapter
            SqlDataAdapter da = new SqlDataAdapter(cmd);
            
            //creating xml data readers for other real estate agencies
            XmlTextReader reader = new XmlTextReader(Server.MapPath("~/OtherAgencies/otherhomes.xml"));

            //creating data set
            DataSet ds = new DataSet();

            //filling ds with properties data and getting datatable
            da.Fill(ds, "Properties");
            DataTable dt = ds.Tables["Properties"];

            //mixing data form the database with data form xml`s
            while (reader.Read())
            {
                string[] homeData = new string[11];
                
                if (reader.NodeType == XmlNodeType.Element)
                {
                    if (reader.Name == "home") { homeData[0] = reader.GetAttribute("homeid"); }
                    if (reader.Name == "deal_type") { homeData[1] = reader.ReadElementString(); }
                    if (reader.Name == "measurement") { homeData[2] = reader.ReadElementString(); }
                    if (reader.Name == "description") { homeData[3] = reader.ReadElementString(); }
                    if (reader.Name == "city") { homeData[4] = reader.ReadElementString(); }
                    if (reader.Name == "street") { homeData[5] = reader.ReadElementString(); }
                    if (reader.Name == "street_nr") { homeData[6] = reader.ReadElementString(); }
                    if (reader.Name == "picture_ID") { homeData[7] = reader.ReadElementString(); }
                    if (reader.Name == "agency") { homeData[8] = reader.ReadElementString(); }
                    if (reader.Name == "price") { homeData[9] = reader.ReadElementString(); }
                    if (reader.Name == "date_added") { homeData[10] = reader.ReadElementString(); }
                    
                }
                
                dt.Rows.Add(homeData);
                //sorting data in datatable NIE DZIAŁA !!!!!!
                //dt.Select("date_added desc;");
                
                //binding datatable to the repeater
                RepeaterDisplayProperties.DataSource = dt;
                RepeaterDisplayProperties.DataBind();

                GridView1.DataSource = dt;
                GridView1.DataBind();

            }
        }
        catch (SqlException ex)
        {
            ErrorOutput.Text = "Error: " + ex.ToString();

        }
        finally
        {
         conn.Close();
            
        }

     }
}
0

Kolego Booyaches... popelniasz jeden blad: a mianowicie wczytujesz jeden element, a nastepnie dodajesz go jako wiersz. Powiniennes w srodku stworzyc petle, w ktorej ladujesz wszystkie pod elementy danego elementu, ktory jest wierszem, a dopiero tak zaladowany wiersz dodac do datatable.

Osobiscie przestalem uzywac datatable... przydaje sie ono wprawdzie jesli sledzisz zmiany w trakcie dzialania apikacji... jednak w przypadku aplikacji webowych praktycznie to nie ma miejsca (gdyz dane sa na nowo odtwarzane przy kazdym poscie).

Optymalny sposob w jaki zaczalem operowac na danych w aplikacjach webowych to tworzenie klas na te dane i uzywanie ich zamiast datatable. Wszystko jest wtedy o wiele bardziej przejrzyste (acz wymaga nieco wiecej skilla i np napisanie wlasnego adaptera przy uzyciu reflection).

Dodatkowo nie powiniennes ladowac danych w page_load tylko w prerender. Wowczas wszystkie zdarzenia sa wykonane (np button clicki), co moze wplywac na sposob filtrowania tych danych. Takie pare uwag ;)

0

Właśnie o takie uwagi mi chodzi... w ten sposób najwięcej się nauczę !! Dziękuję bardzo !

1 użytkowników online, w tym zalogowanych: 0, gości: 1