Laden...

HasChanges() Bug?

Erstellt von cyberblast vor 17 Jahren Letzter Beitrag vor 16 Jahren 2.495 Views
C
cyberblast Themenstarter:in
12 Beiträge seit 2006
vor 17 Jahren
HasChanges() Bug?

Hallo!

Ich habe ein Problem mit dem DataSet. Ich habe ein Form, welches ich nur zum anfügen eines neuen Datensatzes verwende, daher brauche ich die DataTable nicht erst mit Fill zu bestücken. Ich nehme gleich AddNew.

Alles funktioniert wunderbar, bis auf HasChanges(). Diese Methode gibt false zurück, obwohl ich einen neuen Datensatz am anfügen bin.
Rufe ich vorher erst die Fill-Methode auf, gibt HasChanges() true zurück wenn ich AddNew mache!!!

Bin ich der einzige mit dem Problem oder habe ich was übersehen?

Grüsse Martin

F
10.010 Beiträge seit 2004
vor 17 Jahren

Ja, das wir nicht wissen, was Du wirklich machst.

Wie legst Du z.B. die DataTable dann an?
Wie machst Du die Eingabe?
Wie versuchst Du zu speichern?

C
cyberblast Themenstarter:in
12 Beiträge seit 2006
vor 17 Jahren

Im DataSet eist eine DataTable (besteht schon zur DesignZeit).

Die Bindings erstelle ich per Code im Form_Load und nicht per Designer.



...

        private void Form_Load(object sender, EventArgs e)
        {
            //Table Adapters
            ta = new tbl_TestTableAdapter();
            ta.Connection.ConnectionString = "...";
            //taVac.Fill(dsTest.tbl_Test); --> Wenn ich Fill ausführe, gibt HasChanges() True. Die Fill Methode brauche ich aber nicht um nur einen Datensatz anzufügen.

            //Binding Sources
            bs = new BindingSource(dsTest, dsTest.tbl_Test.TableName);

            //DataBindings
            tTst_NameTextBox.DataBindings.Add("Text", bs, dsTest.tbl_Test.tTst_NameColumn.ColumnName, true);
            tTst_VornameTextBox.DataBindings.Add("Text", bs, dsTest.tbl_Test.tTst_VornameColumn.ColumnName, true);

            bs.AddNew();
        }


Wenn ich nun die beiden Textfelder (Name und Vorname) abfülle und danach z.B mit einem Button auf HasChanges() Abfrage, liefert die False.

Habe ich aber zuvor beim Form_Load die Fill-Methode aufgerufen, liefert HasChanges() True, was korrekt ist.

Der Datensatz wird beim EndEdit() und Update() mit oder ohne vorangehendem Fill() aber korrekt in der Datenbank gespeichert.

Gruss

G
84 Beiträge seit 2007
vor 16 Jahren

Hallo,

ich habe auch sehr merkwürdige Verhaltensweisen von Datasets bzgl. der RowStates festgestellt.
Ich denke wir sind hier an dem gleichen Problem, da "hasChanges" auf diesen RowStates basiert.

Folgendes Testszenario:

Ich habe zwei XML Dateien, die eine unterschiedliche Anzahl von Datensätzen enthalten.
Das zweite XML File enthält im Testfall alle Datensätze des ersten zuzüglich eines weiteren.
Es gilt den neuen, im ersten File nicht enthaltenen Datensatz, herauszufinden.

Laut MSDN müsste das wie folgt gehen:


DataSet d1 = new DataSet();
DataSet d2 = new DataSet();
DataSet d3 = new DataSet();

FileStream fs1 = [XMLFile1]
FileStream fs2 = [XMLFile2]

// XML File 1 laden
d1.ReadXml(fs1);
// Nach ReadXML sind alle Rows auf added, daher AcceptChanges() ausführen
// um den Status auf unchanged zu setzen (-> HasChanges = false)
d1.AcceptChanges();

//  zweites XML File in zweites DataSet laden 
d2.ReadXml(fs2);
// Status zurücksetzen
d2.AcceptChanges();

// Beide Datasets mergen
d1.Merge(d2);

// GetChanges sollte alle Datensätze zurückgeben, welche nicht den Status unchanged haben -> alse in dem Fall den einen neuen
d3 = d1.GetChanges();

Das merge funktioniert an der Stelle zwar (d3 enthält die DS des ersten XML + den einen neuen des zweiten), jedoch haben alle Rows den Status unchanged.
Es ist also nicht erkennbar, welcher neu ist.

Kommentiere ich in den obigen Sourcen das "d2.AcceptChanges();" aus, dann sind in d3 alle alten Datensätze auf "modified" und der neue auf "added".

So, und jetzt wirds "spannend":

Versuche ich jetzt mit

d3 = d1.GetChanges(DataRowState.Added);

den einen Datensatz herauszubekommen so gibt er mir alle Datensätze zurück (sowohl Status "added" als auch "modified")?!

Folgendes

d3 = d1.GetChanges(DataRowState.Modified);

gibt mir jedoch nur die "modified" zurück?!

Und das beste, nach

d3 = d1.GetChanges(DataRowState.Unchanged);

sind auch nur die "modified" Rows in d3 enthalten?!

Testumgebung:
WinXP, VS2005, .NET 2.0

Jemand was darüber gehört? Eigene Erfahrungen? Ne Erklärung?
Eine Aussage von M$ dazu habe ich nicht gefunden.

Anhang:
Auszug aus der MSDN DataSet.GetChanges(DataRowState):

The GetChanges method is used to produce a second DataSet object that contains only the changes introduced into the original. Use the rowStates argument to specify the type of changes the new object should include.

This returned copy is designed to be merged back in to this original DataSet. Relationship constraints may cause parent rows marked Unchanged to be included. If no rows of the desired DataRowState are found, the GetChanges method returns a null reference (Nothing in Visual Basic).

Der fettgedruckte Satz hat m.M.n. nichts in einer Doku einer Bibliothek verloren. So eine wischiwaschi Aussage ... das bedeutet für mich soviel wie "wir wissen nicht genau was hier passiert" oder "hier geschieht ein Wunder"^^ 🙁

563 Beiträge seit 2004
vor 16 Jahren

hallo cyberblast

Entweder du hast AcceptChanges() aufgerufen, oder du musst noch EndCurrentEdit aufrufen.

Gruss,
.unreal