ERLEDIGT
NEIN
NEIN
ANTWORTEN
14
14
ZUGRIFFE
622
622
EMPFEHLEN
-
Hi,
ich habe eine Liste in der ich Instanzen drin stehen habe.
Jetzt möchte ich schnellst möglich die Attribute der Instanzen in eine MySQl Datenbank schreiben. Leider habe ich nur eine Möglichkeit gefunden, in der ich jede Instanz aufrufen und jedes Attribut dann einen String Befehl zuweisen muss. Grade das mit der String Konvertierung, es handelt sich ja immerhin um Zahlen, scheint mir sehr ineffizent zu sein.
Gibt es eine bessere Methode?
Vieleicht das ich die Liste per .net direkt an die DB schieben kann?
-
17.02.11 22:57 #2
Hi FJK,
vielleicht zeigst du uns erstmal die Variante die du gefunden hast (als Quelltext) und vielleicht kann es ja dann auch anders gemacht werden.
Gruß
RudolfGTechnologien
(Gute) Grundkenntnisse: HTML, CSS
Fortgeschrittene-Kenntnisse: C++/Qt, C# (WinForms, Webservice), SQL
-
Ich benutze derzeit das hier:
dies habe ich hier gefunden.Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
public void InsertRow(string myConnectionString) { // If the connection string is empty, use a default. if(myConnectionString == "") { myConnectionString = "Database=Test;Data Source=localhost; User Id=username;Password=pass"; } MySqlConnection myConnection = new MySqlConnection(myConnectionString); string myInsertQuery = "INSERT INTO Orders (id, customerId, amount) Values(1001, 23, 30.66)"; MySqlCommand myCommand = new MySqlCommand(myInsertQuery); myCommand.Connection = myConnection; myConnection.Open(); myCommand.ExecuteNonQuery(); myCommand.Connection.Close(); }
Was auch noch intressant zu wissen wäre, ob man die Verbindung für jeden Zugriff beenden und neu aufbauen muss?
Datenbanken scheinen mir nicht sehr Zeitoptimiert zu sein. Schön wäre ja mit Zeigern direkt in der Datenbank zu arbeiten
-
18.02.11 19:05 #4
Ich hätte es wie folgt gemacht:
Code csharp:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
public void InsertRow(string myConnectionString) { // If the connection string is empty, use a default. if(myConnectionString == "") { myConnectionString = "Database=Test;Data Source=localhost; User Id=username;Password=pass"; } using (MySqlConnection myConnection = new MySqlConnection(myConnectionString)) { MySqlCommand command = myConnection.CreateCommand(); command.CommandText = "insert into orders(id, customerid, amaount) values(?id, ?customer_id, ?amount);" conn.Open(); // Das Statement wird auf dem Server schon vorkompiliert command.Prepare(); // Hier werden die Parameter hinzufügt command.Parameters.AddWithValue("id", 1001); command.Parameters.AddWithValue("customer_id", 23); command.Parameters.AddWithValue("amount", 30.66); // Hier muss der Server nur noch die Parameter mit dem vorkompilierten Statement ergänzen und ausführen i. d. R. ist es schneller (besonders bei komplexen Statements! command.ExecuteNonQuery(); } // Das Objekt wird zerstört und die Verbindung an den Pool zurückgegeben! }
Muss man nicht, aber das wird soviel ich weiß dringend empfohlen. Dabei bedient sich der Connector dem Pooling-Verfahren, so dass wenn du die Verbindung aufbaust eine Verbindung aus dem Pool genommen wird.
Datenbanken sind eigentlich so ziemlich die langsamste Komponente bei der Softwareentwicklung (die Code ausführung, Dateien selber schreiben, Netzwerkoperationen etc. gehen schneller!) aber trotzdem setzen es alle ein.
Warum? Der Grund liegt hier darin, dass die Daten sehr strukturiert abgelegt sind und über eine standatisierte Sprache (SQL) abgefragt werden können. Außerdem laufen diese seehr stabil. Sicher bieten diese noch viel mehr Vorteile aber wie du schon selber bemerkt hast auch eben einpaar Nachteile. Trotz allem sind die Datenbanken mehr optimiert als man die Suchroutinen selber schreiben könnte, da hier die letzten Performance-Killer rausgekitzelt werden.
Zeiger auf Datenbanken?! (Kommst du aus der C/C++-Welt?) Sowas habe ich noch nie gehört... Da das ein extrem mächtiges aber auch sehr gefährliches Werkzeug währe, würde keiner die Gewährleistung übernehmen können und wollen, das die Datenbank nach deinen eigenen Operationen nicht komplett zerstört währe.
Gruß
RudolfGTechnologien
(Gute) Grundkenntnisse: HTML, CSS
Fortgeschrittene-Kenntnisse: C++/Qt, C# (WinForms, Webservice), SQL
-
hi,
danke für eure antworten
geht das auch für den Update Befehl?
ist aber immer noch ziemlich string lastig.
auch wenn viele Datensätze hinter ein ander hinein geschrieben werden sollen?
das klingt so falsch in deiner Aussage?
jup
grußGeändert von FJK (19.02.11 um 16:42 Uhr)
-
21.02.11 09:38 #6
Ja das gilt für alle Statements und Sry aber anderes kann ich leider nicht bieten.

Wenn man z. B. mehrere Daten in eine Tabelle einfügen möchte sollte man es nicht so machen.
Beispiel:
Code csharp:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
public void InsertRow(string myConnectionString) { // If the connection string is empty, use a default. if(myConnectionString == "") { myConnectionString = "Database=Test;Data Source=localhost; User Id=username;Password=pass"; } using (MySqlConnection myConnection = new MySqlConnection(myConnectionString)) { MySqlCommand command = myConnection.CreateCommand(); command.CommandText = "insert into orders(id, customerid, amaount) values(?id, ?customer_id, ?amount);" conn.Open(); // Das Statement wird auf dem Server schon vorkompiliert command.Prepare(); for (int i = 0; i < 100; ++i) { double d = i * 1.23; // Hier werden die Parameter hinzufügt command.Parameters.AddWithValue("id", 1001); command.Parameters.AddWithValue("customer_id", 23); command.Parameters.AddWithValue("amount", d); // Hier muss der Server nur noch die Parameter mit dem vorkompilierten Statement ergänzen und ausführen i. d. R. ist es schneller (besonders bei komplexen Statements! command.ExecuteNonQuery(); command.Parameters.Clear(); } } // Das Objekt wird zerstört und die Verbindung an den Pool zurückgegeben! }
Bei mehreren einfüge Operationen kann ja das vorkompilierte Statement vom Server übernommen werden, anstatt es immer wieder neu zu kompilieren. Hier müssen nur die Parameter neu gesetzt und das Statement ausgeführt werden.
Sry aber ich verstehe nicht ganz was du mir damit sagen möchtest. Stimmt das nicht? Wenn nicht dann bitte ich um eine Begründung, da ich es zumindest immer so gelernt habe.
Wie du in meiner Signatur sehen kannst, programmiere ich auch C++ und ich weiß, das sonst keiner das Wort "Zeiger" in den Mund nimmt
.
Gruß
RudolfGTechnologien
(Gute) Grundkenntnisse: HTML, CSS
Fortgeschrittene-Kenntnisse: C++/Qt, C# (WinForms, Webservice), SQL
-
-
21.02.11 11:22 #8
Nein überhaupt nicht, ich benutze diese auch überall wo es nur sinnvoll ist und ich mehr als einpaar Datensätze ablegen muss. Die Datenbanken bieten eine extrem gute und leichte Art die Daten abzulegen/abzufragen. Können von fast allen Programmiersprachen verarbeitet werden und der Server kümmert sich um sehr viele "Kleinigkeiten" bei denen man sich sonst die Finger wund Programmieren würde. Dieser Vorteil hat auch einen Nachteil und das ist nun mal die Performance, diese Bewegt sich aber meistens für den Anwender im nicht spürbaren Bereich.
Solltest du mal Millionen von Datensätze suchen und ausgeben müssen, wird das Statement aber schon ein wenig dauern. Hier kann man aber mit bestimmten Tools (Profiler) die SQL-Statements oder den SQL-Server so weit optimieren (z. B. bestimmte Spalten zu indexieren etc.), dass die Anfragen trotzdem sehr schnell verarbeitet werden können (hier werden natürlich entsprechende Kenntnisse vom System und der Technik dahinter vorausgesetzt!).
Da sind wir einer Meinung
Technologien
(Gute) Grundkenntnisse: HTML, CSS
Fortgeschrittene-Kenntnisse: C++/Qt, C# (WinForms, Webservice), SQL
-
-
22.02.11 23:18 #10
Eigentlich genau wie beim dem Insert, aber hier mal das Beispiel mit Update.
Code csharp:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
public void UpdateRow(string myConnectionString) { // If the connection string is empty, use a default. if(myConnectionString == "") { myConnectionString = "Database=Test;Data Source=localhost; User Id=username;Password=pass"; } using (MySqlConnection myConnection = new MySqlConnection(myConnectionString)) { MySqlCommand command = myConnection.CreateCommand(); command.CommandText = "update orders set amount = ?amount where id = ?id;" conn.Open(); // Das Statement wird auf dem Server schon vorkompiliert command.Prepare(); for (int i = 0; i < 100; ++i) { double d = i * 1.23; // Hier werden die Parameter hinzufügt command.Parameters.AddWithValue("amount", d); command.Parameters.AddWithValue("id", 1000 + i + 1); // Hier muss der Server nur noch die Parameter mit dem vorkompilierten Statement ergänzen und ausführen i. d. R. ist es schneller (besonders bei komplexen Statements! command.ExecuteNonQuery(); command.Parameters.Clear(); } } // Das Objekt wird zerstört und die Verbindung an den Pool zurückgegeben! }
Das kann man meistens nicht machen, da eine Datenbank mehrere Tabellen mit Beziehungen unter einander (mittels Foreign Keys) besitzt. Diese vorher alle Auszulesen/zu Verwalten und dann alle in die neue Datenbank zu schreiben dürfte noch um einiges Länger dauern wie, das Update. Des Weiteren ist das Risiko, dass da irgendwas bei schief läuft unverhältnismäßig hoch.
DAS würde ich auf keinen Fall machen.
Normalerweise muss man nicht alle Datensätze einer Tabelle, geschweige einer Datenbank, ändern, sondern eben nur bestimmte gefilterte Datensätze. Wenn du mal in einer Tabelle für alle Datensätze bestimmte Spalten auf den gleichen Wert setzen musst macht man es ohne die Where-Anweisung. (Wenn es nicht mal ganz konkrete/spezielle Gründe dafür gibt, deutet diese Vorgehensweise oft auf eine fehlerhaft Designte-Datenbank hin!)
Gruß
RudolfGTechnologien
(Gute) Grundkenntnisse: HTML, CSS
Fortgeschrittene-Kenntnisse: C++/Qt, C# (WinForms, Webservice), SQL
-
01.03.11 14:48 #11
- Registriert seit
- Aug 2006
- Beiträge
- 204
Was passiert, wenn der ConnectioNString aus einem Leerzeichen " " besteht?
Dann ist läuft das Programm auf einen Fehler. Besser ist es mit String.IsNullOrEmpty(myString) zu prüfen.
Zudem ist die Schleife fehlerhaft, da die Parameter "amount" und "id" nicht wieder entfernt werden. Somit wird ein Fehler nach dem ersten Durchlauf geworfen werden, dass die Parameter schon vorhanden sind.Geändert von tequila slammer (01.03.11 um 14:52 Uhr)
-
01.03.11 16:37 #12
Da hast du natürlich Recht das sollte man so machen, ich habe das hier nicht gemacht, da ich die Verbindung zur DB und das setzen der Parameters erklären wollte!
Echt? Soviel ich weiß werden die Parameter durch die letzte Zeile in der Schleife entfernt (zumindest funktionieren bei mir so, an sehr vielen Quelltext-Stellen).
Code csharp:1 2 3
... command.Parameters.Clear(); ...
Gruß
RudolfGTechnologien
(Gute) Grundkenntnisse: HTML, CSS
Fortgeschrittene-Kenntnisse: C++/Qt, C# (WinForms, Webservice), SQL
-
01.03.11 16:58 #13
- Registriert seit
- Aug 2006
- Beiträge
- 204
Oh das clear habe ich übersehen. Trotzdem sollte gerade bei Beispielen noch größere Sorgfalt auf den Code gelegt werden, da Anfänger diese gerne immer wieder via Copy & Past weiterverwenden. Und man kann in der Regel nicht davon ausgehen, dass sie sich die Mühe machen zu verstehen was da passiert, wenn es erst einmal funktioniert.
-
Hey,
bezog sich Die Frage vom ersten Post nicht auf ORM ?
-> http://de.wikipedia.org/wiki/Object-Relational_Mapping
-> http://de.wikipedia.org/wiki/Hibernate_%28Framework%29
Also wenn man Objekte speichern möchte, sollte man sich mit Hibernate beschäftigen, aber ich glaube nicht, dass hier die Effizienz gesteigert wird
wenn ich mir vorstelle, dass man die Dinger erstma' serialisieren muss, aber ich hab noch keine ORDB benutzt, deswegen kann ich nix zur Performance sagen.
MfG„Jeder Fehler erscheint unglaublich dumm, wenn Andere ihn begehen.“
Georg Christoph Lichtenberg
Netiquette (vA §15)
Codetags/Codeboxen
Sehr gut gelöste Beiträge bitte mit einem "Danke" abschließen, danke :D
-
02.03.11 19:24 #15
- Registriert seit
- Aug 2006
- Beiträge
- 204
Schwer zu sagen was mit Instanzen gemeint ist. Er möchte ja auch wissen ob er es direkt in die DB schieben kann. Und dann passt die Antwort.
Für .Net gibt es mittlerweile einige OR Mapper. Z.B.: nHibernate oder aber das Entity Framework von Microsoft nur um mal zwei zu nennen.
Ähnliche Themen
-
Irc listen
Von azubi2 im Forum .NET Web und KommunikationAntworten: 3Letzter Beitrag: 25.10.05, 09:49 -
Individuelle Listen
Von Philipp_Frank im Forum PHPAntworten: 5Letzter Beitrag: 07.06.05, 20:21 -
DLL Listen- Absturz, Listen übergeben
Von haemmer im Forum C/C++Antworten: 0Letzter Beitrag: 05.02.04, 21:00 -
listen in c++?
Von mts im Forum C/C++Antworten: 13Letzter Beitrag: 09.07.03, 19:04





Zitieren
Login





