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