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.
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
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
Myślałem, że baza danych na plikach tekstowych będzie o wiele prostsza od tego wszystkiego co wymieniliście powyżej.
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.
Najlżej będzie przy pomocy chyba MySQL Connectora + XAMPP, ew. inny host, niekoniecznie lokalny.
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#
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)
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
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.
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.
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; }
}
}
podkreśla linijkie :
ZapiszDane(@"D:\TempDev\zawodnicy.xml", zawodnicy);
Jest napisane: "Method must have a return type".
Ten kod się kompiluje i działa. Coś musiałeś zepsuć przy kopiowaniu.
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. :(
Kodu nie można sobie wklejać gdziekolwiek. Instrukcje muszą się znajdować wewnątrz metody, właściwości lub konstruktora.
ok dzięki ;)
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.
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.
Ale z tym sortowaniem chodziło o to aby jedną liste sortować wg. pola z innej listy :)
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