Prosta baza dancyh

0

Witam!
Chciałbym aby mój program "współpracował" z bazą danych. Może być oparta na plikach tekstowych (chyba, że jest prostsze rozwiązanie). Może to być coś podobnego jak tu: http://4programmers.net/Delphi/ARtykuły/Bazy_danych_oparte_na_własnych_formatach (tyle, że w C#). Chodzi o to, żeby była możliwość edytowania, usuwania, dodawania rekordów itp. Macie jakieś pomysły jak mogłoby to wyglądać ? Może znacie jakieś materiały (np. kursy,przykłady)? bo ja niestety nic nie znalazłem na ten temat.

0

Jeśli masz Visual Studio to masz też MSSQL Server, na którym możesz postawić bazę danych. Inną opcją jest instalacja, którejś z darmowych baz danych (MySQL lub PostgreSQL) i na niej operować.
Możesz zastosować LINQ To SQL jako ORM, na którym bardzo wygodnie się pracuje, albo któryś z rozwijanych ORM, jak NHibernate czy Entity Framework.
Lepszym wyborem wydaje się zastosowanie jakiejś prostej struktury bazy danych niż zabawa z plikami w tym wypadku.

Tworzenie baz danych z LINQ - http://weblogs.asp.net/scottgu/archive/2007/05/19/using-linq-to-sql-part-1.aspx
Entity Framework - http://msdn.microsoft.com/en-us/library/bb399572
NHibernate - http://nhforge.org/Default.aspx

0

Jeśli chodzi o bazy danych to trzeba zacząć od ADO.NET http://msdn.microsoft.com/en-us/library/e80y5yhx%28v=vs.80%29.aspx
Chyba kazda książka do C# ma co najmniej jeden rozdział poświęcony ADO.NET. Jeżeli już koniecznie pliki to zależy jakie..zwykłe txt czy csv no to również w każdej książce jest min. 1 rozdział o obsłudze strumieni(plików) czyli np http://msdn.microsoft.com/en-us/library/system.io.streamreader.aspx itd
a jak np XML no to również w każdej książce jest rozdział odnośnie XMLa, choć IMHO przy XMLu najlepiej dziś używać LINQ

każde z tych 3 rozwiązań to temat rzeka

0

Myślałem, że baza danych na plikach tekstowych będzie o wiele prostsza od tego wszystkiego co wymieniliście powyżej.

0
paulonio napisał(a):

Myślałem, że baza danych na plikach tekstowych będzie o wiele prostsza od tego wszystkiego co wymieniliście powyżej.

Bardziej upierdliwa. Masz więcej roboty przy usuwaniu czy edycji danego rekordu.

0

Najlżej będzie przy pomocy chyba MySQL Connectora + XAMPP, ew. inny host, niekoniecznie lokalny.

1
xeo545x39 napisał(a):

Najlżej będzie przy pomocy chyba MySQL Connectora + XAMPP, ew. inny host, niekoniecznie lokalny.

Do lokalnych baz danych służy SQLite.
http://sqlite.phxsoftware.com/ - masz dla C#

0

Niestety nie uzyskałem zadowalającej odpowiedzi :-( . Wszystko co wymieniliście powyżej jest dla mnie niestety "czarną magią". Będę musiał zrobić to po swojemu i zadać bardziej skonkretyzowane pytanie: Jak odczytany z pliku tekstowego ciąg znaków typu: „Jan|Kowalski|Kasztanowa|8|1|Warszawa” podzielić na odpowiednie zmienne? (tak aby dane liczbowe można było zapisać do zmiennych liczbowych)

1

Najpierw stosujesz na tym ciągu znaków metodę split("|"), a następnie konwertujesz na liczby te elementy nowo powstałej tablicy, które chcesz, żeby były liczbami.

Pseudokod kompatybilny z językiem Python:

we="Jan|Kowalski|Kasztanowa|8|1|Warszawa"
wy=we.split("|")

imie=wy[0]
nazwisko=wy[1]
ulica=wy[2]
nr_domu=int(wy[3])
nr_mieszkania=int(wy[4])
miejscowosc=wy[5]

print (imie,nazwisko,ulica,nr_domu,nr_mieszkania,miejscowosc)

Kod zwraca w Pythonie >= 3.0

Jan Kowalski Kasztanowa 8 1 Warszawa

W starszych:

('Jan', 'Kowalski', 'Kasztanowa', 8, 1, 'Warszawa')

Różnice w wywołaniu print.

Jak poznasz się trochę na technologiach, to SQL nie będzie dla Ciebie czarną magią, tylko złem koniecznym :D

0

Jak duża ma być ta baza? Jeśli to prosty zbiór danych bez żadnych relacji, to można użyć plików, ale w tym przypadku od tekstowych łatwiejsza będzie serializacja XML.

0

Baza nie będzie raczej duża (w ekstremalncyh przypadkach do 100 "rekordów" :) ). Pracuję nad symulatorem zawodów sportowych i chcę po prostu aby dane o zawodnikach (imię, nazwisko, skille itp.) zostały gdzieś zapisane, tak aby nie trzeba było ich za każdym razem wpisywać.
edit: @somekind chodzi o coś takiego? : http://www.codeproject.com/Articles/13854/Using-XML-as-Database-with-Dataset
Problem w tym, że pierwszy raz stykam się z XML i nie wiem jak "skonstruować" taki plik.

2

Nie, żadnych głupich DataSetów, tylko normalne klasy i serializacja XML:

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

namespace ConsoleApplication11
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            List<Zawodnik> zawodnicy = new List<Zawodnik> {
                new Zawodnik { Nazwisko = "Kowalski", NumerButa = 666},
                new Zawodnik { Nazwisko = "Nowak", NumerButa = -10},
            };

            ZapiszDane(@"D:\TempDev\zawodnicy.xml", zawodnicy);

            List<Zawodnik> zawodnicyOdczytani = WczytajDane(@"D:\TempDev\zawodnicy.xml");
        }

        private static void ZapiszDane(string ścieżka, List<Zawodnik> zawodnicy)
        {
            using (FileStream fs = new FileStream(ścieżka, FileMode.Create, FileAccess.Write))
            {
                new XmlSerializer(typeof(List<Zawodnik>)).Serialize(fs, zawodnicy);
            }
        }

        private static List<Zawodnik> WczytajDane(string ścieżka)
        {
            using (FileStream fs = new FileStream(ścieżka, FileMode.Open, FileAccess.Read))
            {
                return (List<Zawodnik>)new XmlSerializer(typeof(List<Zawodnik>)).Deserialize(fs);
            }
        }
    }

    public class Zawodnik
    {
        public string Nazwisko { get; set; }
        public int NumerButa { get; set; }
    }
} 
0

podkreśla linijkie :

ZapiszDane(@"D:\TempDev\zawodnicy.xml", zawodnicy);

Jest napisane: "Method must have a return type".

0

Ten kod się kompiluje i działa. Coś musiałeś zepsuć przy kopiowaniu.

0

Mój kod Form1:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Xml.Serialization;

namespace Weightlifting_simulator
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        List<zawodnik> zawodnicy = new List<zawodnik> {
                new zawodnik { Imie = "Jan", Nazwisko = "Kowalski", Kraj = "POL", Sila = 100, TechnikaPodrzutu = 100, TechnikaRwania = 100, Doswiadczenie = 100, Psychika = 100 },
                new zawodnik { Imie = "Adam", Nazwisko = "Nowak", Kraj = "POL", Sila = 10, TechnikaPodrzutu = 10, TechnikaRwania = 10, Doswiadczenie = 10, Psychika = 10 },
            };
         ZapiszDane(@"C:\Temp\zawodnicy.xml", zawodnicy);

List<zawodnik> zawodnicyOdczytani = WczytajDane(@"C:\Temp\zawodnicy.xml");


        private static void ZapiszDane(string ścieżka, List<zawodnik> zawodnicy)
        {
            using (FileStream fs = new FileStream(ścieżka, FileMode.Create, FileAccess.Write))
            {
                new XmlSerializer(typeof(List<zawodnik>)).Serialize(fs, zawodnicy);
            }
        }

        private static List<zawodnik> WczytajDane(string ścieżka)
        {
            using (FileStream fs = new FileStream(ścieżka, FileMode.Open, FileAccess.Read))
            {
                return (List<zawodnik>)new XmlSerializer(typeof(List<zawodnik>)).Deserialize(fs);
            }
        }

    }



} 

I jeszcze kod "zawodnik.cs":

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Weightlifting_simulator
{
    public class zawodnik
    {
        public string Imie { get; set; }
        public string Nazwisko { get; set; }
        public string Kraj { get; set; }
        public int Sila { get; set; }
        public int TechnikaRwania { get; set; }
        public int TechnikaPodrzutu { get; set; }
        public int Psychika { get; set; }
        public int Doswiadczenie { get; set; }
    }
}

I w ww linijce wywala błąd, nie wiem dlaczego. :(

1

Kodu nie można sobie wklejać gdziekolwiek. Instrukcje muszą się znajdować wewnątrz metody, właściwości lub konstruktora.

0

ok dzięki ;)

0

Sorki za odświeżanie i doubleposta, ale mam kolejny problem: czy jest jakaś możliwość aby nie wszystkie pola były zapisywane/odczytywane do pliku XML ? Można by tworzyć osobne klasy, ale stwarza to problemy np. przy sortowaniu.

0

Jakie problemy przy sortowaniu? Na pewno da się sortować tablicę/listę według danego pola klasy, tylko trzeba pogrzebać ;)

Co do zapisu "nie wszystkich pól", to masz kilka możliwości. Możesz sprawdzić przy odczycie jakie pola są w danym tagu i wczytać tylko istniejące, możesz wczytywać wszystkie pola i każde pole potraktować wyjątkiem (brzydkie, ale zawsze coś) - czyli try ... próbujesz odczytać, jeśli takiego pola nie ma (catch) to dajesz "" w miejscu tej wartości. Jak zrobisz zapis wybiórczych pól to przy takim odczycie nie będzie ważne, czy zapisałeś wszystkie, czy też kilka.

0

Ale z tym sortowaniem chodziło o to aby jedną liste sortować wg. pola z innej listy :)

0

Też się da, w jednym języku tak, w innym inaczej ;)

Dla wyszukiwania w google "c# sort list of lists":
http://stackoverflow.com/questions/3133758/list-of-lists-sort-with-string-dates

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