Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

11.02.2011, 19:49

[C#] SQLite

wie mancher vielleicht weiß (wegen vorherigen Posts), verwende ich derzeit für mein Projekt SQLite.
Nun wollte ich mal einen kleinen Zeit-Test machen: Ich füttere und frage eine Tabelle mit 5 Spalten (integer, integer, varchar(100), varchar(100), decimal und alle auf NOT NULL) mit 1000 Datensätzen. Dabei habe ich folgendes Ergebnis:
Eingabe und Abfrage: 24 sec.
Nur Eingabe: 20 sec.
Nur Abfrage: 0 sec ( 54 Millisekunden)



Ich finde das ein bisschen viel, aber andererseits wird man niemals so viele Daten gleichzeitig eingeben und dann sofort abfragen...
Ist vielleicht meine Vorgehensweise ineffizient? Im Groben gehe ich so vor:

C-/C++-Quelltext

1
2
3
4
5
sqlCommand = connection.CreateCommand();
                sqlCommand.CommandText = "INSERT INTO PRODUKT (ProduktID, ProduktName, ProduktBeschreibung, ProduktPreis, ProduktAbteilung) " +
                    "VALUES ( " + i.ToString() + ", 'Produkt" + i.ToString() + "', 'Produkt', 5.5, 1);";
                sqlCommand.ExecuteNonQuery();
                sqlCommand.Dispose();

2

11.02.2011, 20:38

Ich finde, dass passt, weil sooft wird ja nicht etwas eingefügt, oder?

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

3

11.02.2011, 20:40

geht vielleicht schneller wenn du die ganze anfrage in einen string packst^^
bei solchen sachen verwendet man nach möglichkeit einen thread und lässt das spiel nebenher weiter laufen.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Tobiking

1x Rätselkönig

  • Private Nachricht senden

4

11.02.2011, 20:47

Wenn die Einträge alle einzelnd hinzugefügt werden kann es natürlich passieren das nach jedem auch verwendete Datenstrukturen angepasst werden, Daten auf die Festplatte geschrieben werden etc. Kurzes Googlen hat da z.B. den Vorschlag ergeben eine Transaktion drumherum zu machen. Dann werden z.B. die Änderungen erst auf die Platte geschrieben wenn alles drin ist.

DerMark

Treue Seele

Beiträge: 324

Wohnort: Emsdetten

Beruf: Softwareentwickler

  • Private Nachricht senden

5

11.02.2011, 21:19

Hi,

du solltest Transaktionen verwenden, quasi eine starten, alles einfügen was du brauchst und die Transaktion dann beenden, das hat zur Folge das erst beim beenden der Transaktion alles in einem Rutsch eingefügt wird.

Und noch etwas: Da du C# nutzt und dazu vermutlich VS, schau dir mal Linq2SQL an, das abstrahiert dir einiges und du brauchst gar nicht mehr mit SQL Abfragen selbst arbeiten.

http://msdn.microsoft.com/de-de/library/bb386976.aspx


mfg Mark

6

12.02.2011, 09:48

Und wie sieht es da mit der Geschwindigkeit aus?

7

12.02.2011, 13:21

Ich check das mit dem Linq+sql nicht. Ich habe eine -mdf-Datenbank mit nur einer Tabele mit den Spalten id und name. Diese "schiebe" ich dann einfach in mein Linq-Diagramm.
Wenn ich jetzt disen Code eingebe:

C-/C++-Quelltext

1
2
3
4
5
6
7
ProduktDataContext db = new ProduktDataContext("Database1.mdf");            
 
            table p = new table();
            p.id = 1;
            p.name = "test";
            
            db.SubmitChanges(ConflictMode.ContinueOnConflict);

kommt diese Fehlermeldung:

C-/C++-Quelltext

1
2
3
4
$exception    {"Fehler beim Anfügen einer automatisch benannten Datenbank für die Datei Database1.mdf. 
Eine Datenbank mit diesem Namen ist bereits vorhanden, die angegebene Datei kann nicht geöffnet werden, 
oder sie befindet sich in der UNC-Freigabe."}    System.Exception 
{System.Data.SqlClient.SqlException}


Was genau mach ich falsch?

DerMark

Treue Seele

Beiträge: 324

Wohnort: Emsdetten

Beruf: Softwareentwickler

  • Private Nachricht senden

8

12.02.2011, 17:26

Von der Geschwindigkeit her ist es genauso wie reines SQL, Linq2SQL ist quasi nur eine Art Wrapper. in dem Beispiel was du grade hast ist wie du siehst der Vorteil das erst alles ausgeführt wird wenn du Submit aufrufst, Linq2SQL wird zuvor eine Transaktion benutzen wenn möglich was wiederum den Geschwindigkeitsvorteil gegenüber deinem Code im Startpost bringt.

Ich bin übrigens sehr froh das du nicht die schwachsinnige Variante bevorzugt hast deine DB durch simples Filehandling zu lösen.

Nun zu dein Problem:

Erstmal, hast du probiert eine relative Pfadangabe zu deiner DB zu verwenden, wie es scheint findet er entweder die Datei nicht oder er versucht die DB neu zu erstellen. Wann genau tritt der Fehler auf?

9

12.02.2011, 17:36

hm. Jetzt hab ich den Connectionstring von den Settings geholt. Jetzt tauchte zumindest keine Ausnahme mehr auf, aber hinzugefügt ist auch nichts...:(

DerMark

Treue Seele

Beiträge: 324

Wohnort: Emsdetten

Beruf: Softwareentwickler

  • Private Nachricht senden

10

12.02.2011, 17:40

Wo genau fügst du denn dein Objekt in die DB ein? :D

Werbeanzeige