Laden...

Problem bei Übergabe von DataSet als Parameter

Erstellt von typhos vor 17 Jahren Letzter Beitrag vor 17 Jahren 1.647 Views
T
typhos Themenstarter:in
243 Beiträge seit 2006
vor 17 Jahren
Problem bei Übergabe von DataSet als Parameter

Hi,
Objekte - also auch DataSets - werden in C# ja soweit ich weiß per Referenz übergeben (genauer: die Referenz auf das Objekt wird als Wert übergeben).

Nun habe ich folgende Situation:
Ich habe eine Klasse, die eine Reihe von DataSets hält. Diese sind anfangs NULL.
Nun erzeuge ich aus dieser Klasse heraus Objekte anderer Klassen. Dabei übergebe ich eines der DataSets dem Konstruktor als Parameter. Ungefähr so:

private DataSet myDataSet;

public OtherClass MyMethod()
{
    return new OtherClass(myDataSet);
}

In der Klasse OtherClass nehme ich also das DataSet entgegen und fülle es mit Daten aus einer Datenbank:

public class OtherClass
{
    private DataSet myDataSet;

    public OtherClass(DataSet paramDataSet)
    {
        myDataSet = paramDataSet;
        // DataSet 'myDataSet' mit Daten befüllen
        FillDataSet();
    }
}

Funktioniert ja im Prinzip auch wunderbar. Nur leider ist myDataSet in der ersten Klasse danach immer noch NULL. Da nur die Referenz auf das DataSet übergeben wird, müsste doch myDataSet in beiden Klassen den gleichen Inhalt haben, weil sie beide auf das gleiche DataSet-Objekt zeigen, oder nicht?

Wo ist mein Denkfehler bzw. welche Lösungen gibt es?

Übrigens: Übergabe per ref oder out geht ja nicht, da ich in der Klasse OtherClass noch mehr Logik habe. ref und out würden ja bedeuten, dass ich am Ende des Konstruktors die geänderten DataSets für die Rückgabe fertig haben müsste...

B
249 Beiträge seit 2005
vor 17 Jahren

Ich würde sagen du musst die Instanz eines Objektes übergeben. Eine Variable die null ist hat kein Speicher zugewiesen..., was soll denn da als Referenz übergeben werden?
Probier mal:


private DataSet myDataSet = new DataSet();

public OtherClass MyMethod()
{
    return new OtherClass(myDataSet);
}

T
typhos Themenstarter:in
243 Beiträge seit 2006
vor 17 Jahren

Ja, OK. Die Idee hatte ich auch schon, aber auch damit hat es nicht funktioniert 🙁

Das kommt mir sehr seltsam vor... oder/und ich hab ein Brett vorm Kopf 🤔

T
typhos Themenstarter:in
243 Beiträge seit 2006
vor 17 Jahren

Seltsamerweise funktioniert der ganze Spaß, wenn ich das DataSet schon in der ersten Klasse befülle und das befüllte DataSet an die 2. Klasse übergebe. In der 2. Klasse (OtherClass im obigen Beispiel) kann ich dann auch neue Zeilen hinzufügen, ändern oder löschen - funktioniert alles wunderbar: Es wird auch in der ersten Klasse entsprechend geändert.
Warum funktioniert es nicht, wenn ich ein leeres DataSet übergebe (also nicht null, sondern new DataSet()) ? Selbst, wenn ich in das DataSet eine Tabelle packe (egal, ob die leer ist oder die Struktur der Datenbanktabelle besitzt), funktioniert es nicht.

Weiß denn niemand, was hier schief läuft?

4.221 Beiträge seit 2005
vor 17 Jahren

Du müsstest nur das DataSet ref übergeben

public OtherClass(ref DataSet paramDataSet)

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

T
typhos Themenstarter:in
243 Beiträge seit 2006
vor 17 Jahren

OK, Danke. Und wie dann weiter?
OtherClass soll sowas wie eine Liste darstellen (nach außen). Das DataSet ist dabei die Datenquelle.
Wenn ich nun also MyClass.MyProperty[5].Test eingebe, dann passiert intern folgendes:

MyClass hat ein Property mit dem sinnvollen Namen MyProperty:

public MyProperty 
{
    get { return new OtherClass(ref myDataSet); }
}

Hier hab ich das ref schon mal mit eingebaut. Hiermit wird also der Konstruktor von OtherClass aufgerufen.
OtherClass besitzt dann auch einen Indexer, mit dem ich auf die Zeilen des DataSets zugreifen kann. Der Indexer gibt mir dann ein Objekt der Klasse ThirdClass zurück, welche ebenfalls das DataSet als Parameter erhält:


public this[int index]
{
    return new ThirdClass(myDataSet, index);
}

ThirdClass wiederum greift dann auf die ihr übergebene Zeile des DataSets zu und gibt durch ihre Properties die Zellen/Spalten der Zeile im DataSet zurück.

Das funktioniert wie schon gesagt auch alles. Dur wenn ich über die ebenfalls in der Klasse OtherClass bereitgestellten Methoden Add(), Remove() etc. das DataSet verändere, ändert es sich nicht in MyClass, wo es eigentlich gehalten werden soll.

Wenn ich dann also wie von Dir vorgeschlagen im Konstruktor ref verwende, gringt mir das also was? Am Ende des Konstruktors ist mit dem DataSet doch noch nichts passiert?!