Baza danych C#. Funkcje kasujce i modyfikujące dane

0

Witam,

Tworzę klasę, która w swoich metodach powinna dodawać zapisywać dane do pliku oraz je kasować.
Napisałem coś takiego:

class ksiazka
	{
		string nazwa;
		string autor;
		string wydawnictwo;
		string isbn;

		public void pobierz_dane()
		{
			Console.WriteLine ("Podaj nazwe ksiazki: ");
			nazwa = Console.ReadLine ();
			Console.WriteLine ("Podaj autora: ");
			autor = Console.ReadLine ();
			Console.WriteLine ("Podaj wydawnictwo: ");
			wydawnictwo = Console.ReadLine ();
			Console.WriteLine ("Podaj numer ISBN: ");
			isbn = Console.ReadLine ();
			string[] ksiazka = new string[4];
			ksiazka [0] = nazwa;
			ksiazka [1] = autor;
			ksiazka [2] = wydawnictwo;
			ksiazka [3] = isbn;
                  }
		public void dodaj_ks ()
		{ // zapisywanie/dodawanie ksiazki do bazy danych

                        byte [] data = Encoding.UTF8.GetBytes();
			string path = @"/home/joanna/biblioteka/biblioteka/ksiazka.txt";
			FileStream fs = new System.IO.FileStream(path, FileMode.Create);
			fs.Write(data, 0, data.Length);
			fs.Close();

		}
		public void usun_ks()
		{ //usuwanie ksiazki z bazy danych 
		}
	} 

Jak poprawnie zapisać pobrane dane do pliku, tak, żeby potem można by je łatwo kasować i modyfikować?
Dopiero zaczynam z C#.

0

Zapisać dane do xml zamiast txt.

0

Ok, zmieniłem trochę

public void pobierz_dane()
		{
			Console.WriteLine ("Podaj nazwe ksiazki: ");
			nazwa = Console.ReadLine ();
			Console.WriteLine ("Podaj autora: ");
			autor = Console.ReadLine ();
			Console.WriteLine ("Podaj wydawnictwo: ");
			wydawnictwo = Console.ReadLine ();
			Console.WriteLine ("Podaj numer ISBN: ");
			isbn = Console.ReadLine ();
			string[] ksiazka = new string[4];
			ksiazka [0] = nazwa;
			ksiazka [1] = autor;
			ksiazka [2] = wydawnictwo;
			ksiazka [3] = isbn;


			 File.WriteAllLines(@"/home/joanna/biblioteka/biblioteka/ksiazka.xml", ksiazka);
}

Ale zapisuje do xml tylko pierwszą linijkę. W czym jest błąd?:/

0

Zrób to podobnie, jak opisują tutaj http://support.microsoft.com/kb/301228

1

http://forum.codecall.net/topic/58239-c-tutorial-reading-and-writing-xml-files/ prześledź ten tutorial, zrozum czym jest element/atrybut etc (proste to jest) i będziesz doskonale wiedział jak to zrobić poprawnie.

Dodatkowo zamiast robić:

 Console.WriteLine ("Podaj numer ISBN: ");
            isbn = Console.ReadLine ();
            string[] ksiazka = new string[4];
            ksiazka [0] = nazwa; 

moze po prostu:

 ....
 string[] ksiazka = new string[4];
.....
 Console.WriteLine ("Podaj numer ISBN: ");
            ksiazka[0] = Console.ReadLine ();       
         
1

Poczytaj o serializacji. Zapisuje Ci obiekty do pliku XML i w takim samym stanie je odczytujesz.

0
ne0 napisał(a):

http://forum.codecall.net/topic/58239-c-tutorial-reading-and-writing-xml-files/ prześledź ten tutorial, zrozum czym jest element/atrybut etc (proste to jest) i będziesz doskonale wiedział jak to zrobić poprawnie.

Działam według tego poradnika.
Zobiłem tak:

i nie wiem czemu nie tworzy pliku i nie zapisuje tam nic :/

public void pobierz_dane()
		{
			XmlWriterSettings settings = new XmlWriterSettings();
			settings.Indent = true;

			XmlWriter writer = XmlWriter.Create ("ksiazka.xml", settings);

			writer.WriteStartDocument();

			writer.WriteStartElement("Ksiazka");
			Console.WriteLine ("Podaj nazwe ksiazki: ");
			writer.WriteAttributeString("Nazwa", Console.ReadLine ());
			Console.WriteLine ("Podaj autora: ");
	                writer.WriteAttributeString("Autor", Console.ReadLine ());

		

			writer.WriteEndElement();
			writer.WriteEndDocument();
			writer.Flush();
			writer.Close();
		
}
1

ręcę opadają.... pomyśl ;]

podałeś ścieżkę "ksiazka.xml" czyli gdzie Ci się to zapisze?
zresztą w ogóle jak sprawdziłeś że ci tego nie zapisał co? nawet nie przeszukałeś kompa w poszukiwaniu tego pliku kolego!
podaj ściężkę np. na pulpit albo na C: albo tam gdzie chcesz aby się zapisał ten plik.

0

plik zapisal ci sie w folderze "bin",a ty zapewne tam nie szukales:)

0

Znalazłem tutorial
http://mndevnotes.wordpress.com/2012/05/18/kolekcja-obiektow-i-plik-xml-zapis-odczyt-i-modyfikacja-danych-przy-uzyciu-linq-to-xml/

I zrobiłem według niego taki kod. Z tym, że nie potrafię sie doszukać przyczyny błędu .
Wyskakuje mi coś takiego:

Error CS1935: An implementation of OrderBy' query expression pattern could not be found. Are you missing System.Linq' using directive or `System.Core.dll' assembly reference? (CS1935)

W linijce z "orderby"
Dodawałem już do referencji System.Core jak i System.Xml.Linq.
Nic to nie daje

List<Ksiazka> listaKsiazek = new List<Ksiazka> ();
				listaKsiazek.Add (new Ksiazka ("OjciecChrzestny", "MarioPuzo", "NowaEra", "180"));
				XDocument xml = new XDocument (
				//	new XDeclaration ("1.0", "utf-8", "yes"),
					new XComment ("Lista ksiazek z kolekcji"),
					new XElement ("ksiazki",
				              from ksiazka in listaKsiazek
				              orderby ksiazka.Nazwa, ksiazka.Autor
				              select new XElement("osoba",
				                    new XAttribute("pesel", ksiazka.Nazwa),
				                
				                    new XElement("wzrost", ksiazka.Autor)
				                    )
				              )
					);

				xml.Save("ksiazki.xml");

To jest moja klasa:

class Ksiazka
	{	
		public string Nazwa { get; set; }
		public string Autor { get; set; }
		public string Wydawnictwo { get; set; }
		public string Isbn { get; set; }

		public Ksiazka()
		{

		}
		public 	Ksiazka(string nazwa, string autor, string wydawnictwo, string isbn)
		{
			Nazwa = nazwa;
			Autor = autor;
			Wydawnictwo = wydawnictwo;
			Isbn = isbn;
		}
0

Jesteś pewien? :) bo ja po przekopiowaniu dostaje taki pliczek w efekcie końcowym:

<?xml version="1.0" encoding="utf-8"?> <ksiazki> <osoba pesel="OjciecChrzestny"> <wzrost>MarioPuzo</wzrost> </osoba> </ksiazki>

takie mam referencje:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;

0

Kolejne pytanie:

public void pobierz_dane()
		{

		

			// pobieranie danych ksiazki i zapisywanie ich do xml
			Console.WriteLine ("Podaj nazwe ksiazki: ");
			Nazwa = Console.ReadLine ();
			Console.WriteLine ("Podaj autora: ");
			Autor = Console.ReadLine ();
			Console.WriteLine ("Podaj wydawnictwo: ");
			Wydawnictwo = Console.ReadLine ();
			Console.WriteLine ("Podaj numer ISBN: ");
			Isbn = Console.ReadLine (); 

			FileStream plik = new FileStream ("ksiazki.xml", FileMode.Append, FileAccess.ReadWrite);
			List<Ksiazka> listaKsiazek = new List<Ksiazka> ();
			listaKsiazek.Add (new Ksiazka (Nazwa , Autor, Wydawnictwo , Isbn));
			XDocument xml = new XDocument (
				// new XDeclaration ("1.0", "utf-8", "yes"),
				new XComment ("Lista ksiazek z kolekcji"),
				new XElement ("ksiazki",
			              from ksiazka in listaKsiazek
			              orderby Nazwa, Autor, Wydawnictwo, Isbn 
			              select new XElement("ksiazka",	
			                    new XAttribute("nazwa", Nazwa),

			                    new XElement("autor", Autor),
			                    new XElement("wydawnictwo", Wydawnictwo),
			                    new XElement("isbn", Isbn)

			                    )
			              )
				);

		//	xml.Save("ksiazki.xml");
			plik.Write ((xml)xml);                                   <----- 
				plik.Close ();	

			          }  

Męczę się z zaprogramowaniem tej linijki ze strzałką tak, żeby dopisywała cały ten stworzony Xdokument do pliku ksiazki.xml.
Potrzebuje konkretnej odpowiedzi co jest źle, jakie powinny być komendy w tym Write lub WriteByte
Mam otwarty poradnik ale próbowałem na wszystkie sposoby wzorując sie na nim i nie wychodzi..

Wiem, że jest źle.. Moje pytanie - jak ma to być poprawnie...

0

Zmodyfikowałem twój poprzedni kod, tak to powinno wyglądać.

List<Ksiazka> listaKsiazek = new List<Ksiazka>();
            listaKsiazek.Add(new Ksiazka("OjciecChrzestny", "MarioPuzo",
                "NowaEra", "180"));
            
            XDocument x = XDocument.Load("ksiazki.xml");
            x.Root.Add(from ksiazka in listaKsiazek
                       orderby ksiazka.Nazwa, ksiazka.Autor select
                       new XElement("ksiazka",
                                new XElement("autor", ksiazka.Autor),
                                new XElement("wydawnictwo", ksiazka.Wydawnictwo),
                                new XElement("isbn", ksiazka.Isbn)));
            x.Save("ksiazki.xml");
1

Pojawia się błąd taki : "Document element did not appear. file:///home/uzytkownik/biblioteka/biblioteka/bin/Debug/ksiazki.xml Line 1, position 1." Plik oczywiście istnieje.. Gdy go otwieram pojawia się w nim ten sam błąd

Skasuj zawartość tego pliku i wrzuć coś takiego:

<?xml version="1.0" encoding="utf-8"?>
<ksiazki>

</ksiazki>
0

Skorzystaj z System.Xml.Serializer (musisz dodać referencję do solucji). Przykładowy kod poniżej.

using System;
using System.Xml.Serialization;
using System.Collections.Generic;
using System.IO;

class Program
{
    static void Main(string[] args)
    {
        var katalog = new KatalogKsiazek();
        katalog.DodajKsiazke(new Ksiazka { Autor = "Sienkiewicz", Tytul = "Ogniem i mieczem" });
        katalog.DodajKsiazke(new Ksiazka { Autor = "Mickiewicz", Tytul = "Pan Tadeusz" });
        katalog.WyswietlKsiazki();

        string plik = "katalog.xml";
        katalog.ZapiszDoPliku(plik);

        var nowyKatalog = new KatalogKsiazek();
        Console.WriteLine("\nNowy katalog:");
        nowyKatalog.WczytajZPlik(plik);
        nowyKatalog.WyswietlKsiazki();

        Console.ReadLine();
    }
}

class KatalogKsiazek
{
    private List<Ksiazka> _ksiazki;

    public void DodajKsiazke(Ksiazka ksiazka)
    {
        _ksiazki.Add(ksiazka);
    }

    public void WyswietlKsiazki()
    {
        Console.WriteLine("Zbior zawiera {0} ksiazek:", _ksiazki.Count);
        foreach (var ksiazka in _ksiazki)
        {
            Console.WriteLine(ksiazka);
        }
    }

    public void ZapiszDoPliku(string nazwaPliku)
    {
        XmlSerializer xs = new XmlSerializer(typeof(List<Ksiazka>));
        using (Stream s = File.Create(nazwaPliku))
            xs.Serialize(s, _ksiazki);

        Console.WriteLine("Katalog zostal zapisany do pliku.");
    }

    public void WczytajZPlik(string nazwaPliku)
        {
            XmlSerializer xs = new XmlSerializer(typeof(List<Ksiazka>));
            using (Stream s = File.OpenRead(nazwaPliku))
                _ksiazki = (List<Ksiazka>) xs.Deserialize(s);

            Console.WriteLine("Katalog zostal wczytany z pliku.");
        }

    public KatalogKsiazek()
    {
        _ksiazki = new List<Ksiazka>();
    }
}

public class Ksiazka
{
    public string Tytul;
    public string Autor;

    public override string ToString()
    {
        return String.Format("{0} - {1}", Tytul, Autor);
    }
}
0

Mam problem z zaprogramowaniem funkcji wypozycz
Chce to zrobic tak, ze zostanie pobrany z klawiatury indeks uzytkownika, program znajdzie go na liście w pliku xml i dopisze przy nim ISBN wypozyczanej ksiazki. Tytuł wcześniej  zostanie pobrany z klawiatury, odnaleziony w pliku ksiazki.xml i sprawdzi czy ksiazka ma status "dostepny" czy "niedostępny".
Nie wiem za bardzo jak sie za to zabrać. To jest moja klasa "uzytkownik"

class Uzytkownik
	{
		public string Imie { get; set; }
		public string Nazwisko { get; set; }
		public string Nr { get; set; }

	Ksiazka k1;

		virtual public void pobierz_dane()
		{
		}


		virtual public void wypozycz()
		{	//wczytywanie ksiazki z bazy ksiazek i dodawanie do bazy uzytkownika

		Console.WriteLine ("Podaj ISBN ksiazki, ktora chcesz wypozyczyc");
		k1.Isbn = Console.ReadLine ();

		XmlSerializer xs = new XmlSerializer(typeof(List<Ksiazka>));
		using (Stream s = File.OpenRead("ksiazki"));
		// Ksiazka = (List<Ksiazka>) xs.Deserialize(s);


		 }

		virtual public void oddaj()
		{
			//wczytywanie ksiazki z bazy uzytkownika i usuwanie jej z jego bazy

		}

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