doczytanie danych z bazy do danych czytanych z pliku xml

0

Cześć. Mam przykładowy model:

public class Osoba
{
 public string Imie {get;set;}
 public string Nazwisko {get;set;}
 public int Id {get;set;}
 public int NumerIdentyfikatora {get;set;}
}

W aplikacji muszę wykorzystać listę obiektów typu osoba

List<Osoba>

Potrzebuję wczytać część danych tego modelu z pliku XML a część z bazy sql. Z pliku xml wczytałem już Imie i Nazwisko, teraz z bazy planuje doczytać dwie pozostałe wartości. Trochę to dla mnie dziwnie wyglada takie "sztukowanie" danych ale chyba nie ma innego wyjścia skoro czesc jest w pliku a czesc w bazie.
Jak byscie to teraz zrobili, utworzyc najpierw obiekty z danymi z pliku xml, wrzucic je do listy i pozniej przejsc w pętli po wszystkich elementach listy doczytujac im brakujace dane z bazy. Czy raczej do listy powinien trafić już kompletny obiekt, czyli coś w stylu

List<Osoba> osoby = new Llist<Osoba>();
Osoba osoba ;
//teraz rozpoczynam pętle dla wszystkich znalezionych w xml osob
osoba = new Osoba();
// tu wczytuje dane z xml do obiektu dla pojedynczej osoby
//teraz pobieram dane z bazy do pozostałych dwóch pól obiektu
osoby.Add(osoba);
//koniec petli dla osob z xml
2

Nie bardzo rozumiem:
Pobrałeś z pliku xml:

public string Imie {get;set;}
 public string Nazwisko {get;set;}

A z bazy danych chcesz pobrać:

public int Id {get;set;}
 public int NumerIdentyfikatora {get;set;}

Jak w takim razie zamierzasz "przyporządkować" identyfikatory do osoby? Chcę pomóc, tylko wyjaśnij mi nieco lepiej jeśli możesz :)

0

Czemu masz to tak dziwnie podzielone? Nigdy się z czymś takim nie spotkałem i jeśli to jest jakieś zadanie na uczelni to zmień szkołę albo zapytaj wykładowcy jakie jest tego zastosowanie. Jest jeszcze druga opcja - nie zrozumiałeś zadania ;-) Skoro imię i nazwisko jest w XML, a reszta w bazie danych to skąd wiadomo czy dobrze "połączysz" te dane?

0

Zanim zaczniesz "sztukować" dane jedno pytanie. Czy jest jakiś identyfikator, który pozwoli połączyć ci dane z tych dwóch zasobów - Xml + DB? w Xml z tego co piszesz posiadasz tylko Imię + Nazwisko. Czy ta para jest unikalna? Pytam bo mogą wystąpić problemy z unikalnością danych co uniemożliwi ich proste połączenie.
Co do sposobu ich przeprocesowania. Moje najprostsze podejście by wyglądało tak:

  1. Odczyt z pliku Xml do kolekcji List<Osoba>
  2. Odczyt danych z DB
  3. Merge danych - tutaj dopiero pętla po kolekcji List<Osoba> i dla każdego elementu dopisanie danych, które już masz pobrane z bazy.
    Takie podejście wykonano** jedno zapytanie** do bazy danych.
    ALE! Z drugiej strony jeśli w pliku Xml będą załóżmy dwa rekordy a w bazie 1mln to bez sensu będzie pobieranie tych wszystkich danych z DB! Czyli można pomyśleć o jakimś filtrowaniu (warunek Where z In Set itp.) tak aby był jak najmniejszy narzut na DB. Wybiegam tutaj może trochę do przodu ale prędzej czy później takie problemy się pojawiają w projektach i dobrze to rozważyć.
0

Moja wina, przeoczyłem jedno pole :( W xml mam jeszcze numer zamówienia po ktorym jednoznacznie połącze dane z xml z tymi z bazy. W pliku xml mogę mieć 500-600 osób

public class Osoba
{
 public string Zamowienie {get;set;}
 public string Imie {get;set;}
 public string Nazwisko {get;set;}
 public int Id {get;set;}
 public int NumerIdentyfikatora {get;set;}
}
0

Nie jestem wyjadaczem więc pewnie można to zrobić lepiej, ale zrobiłbym to tak:

    public class XmlOrder
    {
        public XmlOrder(string Name, string Surname, string OrderNumber)
        {
            this.Name = Name;
            this.Surname = Surname;
            this.OrderNumber = OrderNumber;
        }
        public string Name { get; private set; }
        public string Surname { get; private set; }
        public string OrderNumber { get; private set; }
    }
    public class Order : XmlOrder
    {
        public Order(XmlOrder xmlOrder, int Id, int IdNumber) : base(xmlOrder.Name, xmlOrder.Surname, xmlOrder.OrderNumber)
        {
            this.Id = Id;
            this.IdNumber = IdNumber;
        }

        public int Id { get; private set; }
        public int IdNumber { get; private set; }
    }
    private XmlOrder[] GetXmlOrders()
    {
        //Pobranie danych z pliku xml
        throw new Exception();
    }
    private Order[] CompleteOrdersFromDB(XmlOrder[] xmlOrders)
    {
        //Uzupełnienie danych z pliku XML o dane z bazy danych SQL
        throw new Exception();
    }
    public Order[] GetOrders()
    {
        XmlOrder[] xmlOrders = GetXmlOrders();
        return CompleteOrdersFromDB(xmlOrders);
    }
  1. Za pomocą tej metody pobierasz skompletowane dane z xml i sql
 public Order[] GetOrders()
  1. Tutaj pobierasz wszystkie dane z pliku xml
private XmlOrder[] GetXmlOrders();
  1. Następnie dysponując numerami zamówienia możesz ułożyć zapytanie do bazy SQL i wyciągnąć wszystkie rekordy odpowiadające numerom zamówienia i przypisać je do "Order".
private Order[] CompleteOrdersFromDB(XmlOrder[] xmlOrders);
0
  1. Czy obydwa źródła danych są do dziś aktywnie wykorzystywane, czy może stan się ustabilizował i dane zapisywane są w bazie lub pliku? Jeśli w jednym ze źródeł masz dane dotyczące transakcji z przeszłości to jedynym słusznym rozwiązaniem jest migracja tych danych do jednego rozwiązania. O ile oczywiście masz kontrolę.
    Jeżeli obydwa źródła są aktywnie używane to i tak rozsądnie byłoby się zastanowić nad przejściem na jedno z dwóch i trzymać dane w jednym miejscu.

  2. Jeżeli masz identyfikator, który pozwala na zidentyfikowanie konkretnej osoby zarówno w jednym jak i drugim źródle to sytuacja jest prosta. Jedynym problemem może być wybór odpowiedniego wpisu w przypadku znalezienia więcej niż jednego pasującego do konkretnej osoby. Trzeba będzie pewnie sugerować się datą zamówienia albo numerem.

Nigdy się z czymś takim nie spotkałem i jeśli to jest jakieś zadanie na uczelni to zmień szkołę albo zapytaj wykładowcy jakie jest tego zastosowanie.

Czasem na podobne kwiatki można trafić migrując dane albo integrując systemy... Tabelki bez kluczy obcych, joiny robione nie na identyfikatorach a wartościach tekstowych typu właśnie nazwisko albo nazwa.

0

Jakby to był mssql to ja bym wysłał xmla do bazy i na bazie zrobił joina, i jedną pętla wpisał do listy.

Zależy oczywiście jak duży jest ten xmla, ale ja lubię sqla...

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