myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Datentechnologien » Wieso verdoppelt sich die ganze SQLite Table, wenn ich update?
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Wieso verdoppelt sich die ganze SQLite Table, wenn ich update?

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
C4RL0
myCSharp.de-Mitglied

avatar-3444.png


Dabei seit: 01.06.2012
Beiträge: 80
Entwicklungsumgebung: VS 2015
Herkunft: Osnabrück


C4RL0 ist offline

Wieso verdoppelt sich die ganze SQLite Table, wenn ich update?

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Moin zusammen,

ich lese eine SQLite DB Tabelle mit "SELECT * ..." in eine DataTable, welche ich per Databinding incl. BindingNavigator an Textboxen binde.
Wenn ich nun mit folgender Methode die DataTable zurückspeichern möchte, verdoppelt sich die DB Tabelle, d.h. es wird nicht geupdatet sondern insertet. Ich weiß nur nicht, warum?

Hat jemand eine Idee?

C#-Code:
        public static int SaveDataTable(DataTable DT)
        {
            int rowsUpdated = 0;
            try
            {
                using (SQLiteConnection cnn = new SQLiteConnection(_ConnectionString))
                {

                    using (SQLiteCommand myCommand = cnn.CreateCommand())
                    {
                        myCommand.CommandText = string.Format("SELECT * FROM {0}", DT.TableName);
                        using (SQLiteDataAdapter myDataAdapter = new SQLiteDataAdapter(myCommand))
                        {
                            using (SQLiteCommandBuilder builder = new SQLiteCommandBuilder(myDataAdapter))
                            {
                                cnn.Open();
                                rowsUpdated = myDataAdapter.Update(DT);
                            }
                        }
                    }
                }
                return rowsUpdated;
            }
            catch (Exception Ex)
            {
                MessageBox.Show(Ex.Message);
                return rowsUpdated;
            }
        }

Edit: Ich habe festgestellt, dass, wenn ich DT.AcceptChanges() vorher ausführe, obiges nicht passiert. Allerdings werden dann auch keine Changes gespeichert. D.h. wieder kein Update.

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von C4RL0 am 26.05.2020 18:38.

Neuer Beitrag 26.05.2020 18:00 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
FZelle
myCSharp.de-Poweruser/ Experte

Dabei seit: 23.04.2004
Beiträge: 9.843


FZelle ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Und wie hast du die DT erzeugt?

Der DataAdapter macht genau was er soll, nicht was Du denkst, was er machen soll.
Neuer Beitrag 26.05.2020 18:41 Beiträge des Benutzers | zu Buddylist hinzufügen
T-Virus T-Virus ist männlich
myCSharp.de-Mitglied

Dabei seit: 17.04.2008
Beiträge: 1.546
Entwicklungsumgebung: Visual Studio, Codeblocks, Edi
Herkunft: Nordhausen, Nörten-Hardenberg


T-Virus ist offline Füge T-Virus Deiner Kontaktliste hinzu

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Klingt auch nach einem Fall von kein PK oder neuen PKs im DataTable.
Ansonsten würde es beim inserten auch knallen, wenn du doppelte Daten inserten würdest.

T-Virus

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von T-Virus am 26.05.2020 21:28.

Neuer Beitrag 26.05.2020 21:25 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Th69
myCSharp.de-Poweruser/ Experte

avatar-2578.jpg


Dabei seit: 01.04.2008
Beiträge: 3.636
Entwicklungsumgebung: Visual Studio 2015/17


Th69 ist online

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Der Fehler ist recht trivial (wenn man weiß wieso):
Du mußt selbstverständlich dieselbe SQLiteDataAdapter-Instanz beim Lesen und Schreiben benutzen!
Neuer Beitrag 27.05.2020 10:11 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
FZelle
myCSharp.de-Poweruser/ Experte

Dabei seit: 23.04.2004
Beiträge: 9.843


FZelle ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Das stimmt nicht, das ist vollkommen unabhängig voneinander.

Aber wenn jemand schon in Erwägung zieht AcceptChanges zu benutzen,
dann ist da schon etwas am Grundverständnis nicht OK.

Deswegen ist es wichtig zu wissen wie die DT entstanden ist.
Neuer Beitrag 27.05.2020 10:43 Beiträge des Benutzers | zu Buddylist hinzufügen
C4RL0
myCSharp.de-Mitglied

avatar-3444.png


Dabei seit: 01.06.2012
Beiträge: 80
Entwicklungsumgebung: VS 2015
Herkunft: Osnabrück

Themenstarter Thema begonnen von C4RL0

C4RL0 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Also die DT entsteht folgendermaßen:

C#-Code:
        internal static DataTable GetDataTable(string tablename)
        {
            using (DataTable dataTable = new DataTable())
            {
                using (SQLiteConnection connection = new SQLiteConnection(_ConnectionString))
                {
                    using (SQLiteCommand command = new SQLiteCommand(connection))
                    {
                        using (SQLiteDataAdapter adapter = new SQLiteDataAdapter(command))
                        {
                            command.CommandText = string.Format("SELECT * FROM {0}", tablename);
                            connection.Open();
                            adapter.Fill(dataTable);
                            connection.Close();
                            return dataTable;
                        }
                    }
                }
            }
        }

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von C4RL0 am 27.05.2020 11:20.

Neuer Beitrag 27.05.2020 11:17 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 13.938
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Schau Dir an wie ein using() funktioniert.
Du disposed die DataTable und gibst sie dann zurück - das macht kein Sinn.

C#-Code:
        internal static DataTable GetDataTable(string tablename)
        {
                using (SQLiteConnection connection = new SQLiteConnection(_ConnectionString))
                using (SQLiteCommand command = new SQLiteCommand(connection))
                using (SQLiteDataAdapter adapter = new SQLiteDataAdapter(command))
                {
                            command.CommandText = string.Format("SELECT * FROM {0}", tablename);
                            connection.Open();
                            adapter.Fill(dataTable);
                            connection.Close();
                            return dataTable;
                }
        }

Aber ich drücke mich mal vorsichtig aus, dass der ganze Code hier "suboptimal" ist.
Er verletzt zig Prinzipien und Empfehlungen; und darüber hinaus untestbar (=>  [Artikel] Unit-Tests: Einführung in das Unit-Testing mit VisualStudio )
Persönlich weiß ich auch nicht, ob das Grundkonstrukt mit der Verbindungsverwaltung und der DataTable so überhaupt funktionieren kann. Das weiß jemand vielleicht besser, der noch DataTables verwendet (ich seit Jahren nicht mehr).

PS: wie auch Parameter (  [Artikelserie] SQL: Parameter von Befehlen ) muss man Table Names behandeln, um sich zu schützen

C#-Code:
var builder = new SqlCommandBuilder();
string escapedTableName = builder.QuoteIdentifier(tableName);
Neuer Beitrag 27.05.2020 11:31 Beiträge des Benutzers | zu Buddylist hinzufügen
C4RL0
myCSharp.de-Mitglied

avatar-3444.png


Dabei seit: 01.06.2012
Beiträge: 80
Entwicklungsumgebung: VS 2015
Herkunft: Osnabrück

Themenstarter Thema begonnen von C4RL0

C4RL0 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von Abt:
Aber ich drücke mich mal vorsichtig aus, dass der ganze Code hier "suboptimal" ist. Er verletzt zig Prinzipien und Empfehlungen; und darüber hinaus untestbar.

Die Aussage ist völlig okay, da weiß ich, dass ich noch was zu tun habe. Mit dem Testen habe ich mich eh zu wenig beschäftigt. ;)

Zitat von Abt:
Persönlich weiß ich auch nicht, ob das Grundkonstrukt mit der Verbindungsverwaltung und der DataTable so überhaupt funktionieren kann. Das weiß jemand vielleicht besser, der noch DataTables verwendet (ich seit Jahren nicht mehr).

Was verwendest Du statt DataTables?
Neuer Beitrag 27.05.2020 12:21 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 13.938
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ich hab nie den Bedarf eine gesamte Datenbanktabelle in den Speicher einer Anwendung zu laden. Würde in dem Umfeld, in dem ich meistens bei Kunden bin, auch gar nicht gehen oder gar sinn machen.
Ich arbeite daher prinzipiell mit Selektionen und Projektionen, zB dann mit Entity Framework oder Dapper und entsprechenden Modellen und Architekturprinzipien.
Neuer Beitrag 27.05.2020 12:36 Beiträge des Benutzers | zu Buddylist hinzufügen
FZelle
myCSharp.de-Poweruser/ Experte

Dabei seit: 23.04.2004
Beiträge: 9.843


FZelle ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ganz abgesehen davon, der TableAdapter hat einen Contructor, der bereits den Connectionstring entgegennimmt.

Aber T-Virus hat eine gute Anmerkung gemacht, wie ist denn der Key der DB erstellt?
Neuer Beitrag 27.05.2020 15:03 Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als ein Monat.
Der letzte Beitrag ist älter als ein Monat.
Antwort erstellen


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 03.07.2020 14:40