Ich hab da ein Problem mit einer Methode...
-
Ja, ich weiß, dummer Threadtitel, aber mir wollte einfach kein besserer einfallen
Ich sende Abfragen an eine MS-SQL-Datenbank und zwar häufiger, daher wollte ich alles in eine Methode packen, allerdings habe ich da Probleme mit der konkreten Umsetzung. Wäre nett, wenn mal jemand einen Blick drauf werfen könnte, ist sicher nicht SO schwer (nur für mich :D).
SqlDataAdapter anfrage = new SqlDataAdapter ("select Name from Benutzer", "server=client;database=db;uid=name;pwd=pw"); DataSet ds = new DataSet (); anfrage.Fill (ds, "Benutzer");
Das wollte ich in eine Methode packen. Und diese sieht bisher so aus:
private DataSet Abfrage(string request, string table) //Abfrage, Tabellenname { string conn = "server=client;database=db;uid=name;pwd=pw"; SqlDataAdapter ergebnis = new SqlDataAdapter(request, conn); DataSet ds = new DataSet(); ergebnis.Fill(ds, table); Abfrage = ergebnis; }
War klar dass es nicht klappt, weil erst ein Objekt erzeugt werden muß, aber ich weiß nicht wie
-
Kommst du zufällig aus der VB-Ecke?
Objekte/Werte gibt man in C/C++/C# mit "return" zurück.
Und ausserdem versuchst du den Datenadapter zurückzugeben. Als Rückgabetyp hat die Funktion allerdings "DataSet".
Korrekt wäre demnach:private DataSet Abfrage(string request, string table) //Abfrage, Tabellenname { string conn = "server=client;database=db;uid=name;pwd=pw"; SqlDataAdapter ergebnis = new SqlDataAdapter(request, conn); DataSet ds = new DataSet(); ergebnis.Fill(ds, table); //Hier wird ds mit einer Tabelle gefüllt, die unter dem Namen "table" abgelegt wird. return ds; //Rückgabe des Datasets, gefüllt mit einer Tabelle namens table }
-
So ähnlich - ich habe mal mit Turbo Pascal angefangen und zwischenzeitlich etwas mit C++ gearbeitet, dass mit dem Return war mir entfallen
Allerdings tue ich mich immer noch schwer mit dem OOP-Konzept - egal wieviel ich dazu auch noch lese
Wie greife ich dann auf Abfrage zu?
Bisher war die Zuweisung z.B. zu einer Combobox ja so:
combo.DataSource = ds.Tables[table];
Hab's so probiert, scheint aber irgendwie nicht so richtig zu funktionieren:
DataSet test = new DataSet(); test = Abfrage(req, tab); combo.DataSource = test.Tables[tab];
-
Eigentlich sollte es genau so funktionieren. Was genau funktioniert denn nicht? Compilerfehler, Laufzeitfehler?
btw.: In der ersten Zeile reicht ein
DataSet test;
,da in der Funktion schon Speicher für dein DataSet reserviert wird.
-
Ich hatte was vergessen
Danke für den Hinweis.
-
private void comboseminargruppe2_SelectionChangeCommitted(object sender, System.EventArgs e) { combodozenthonorar.Items.Clear(); try { DataSet test; string temp = comboseminargruppe2.Text; test = Abfrage("SELECT personen.personenname FROM seminargruppen, lehrauftraege, personen WHERE '" + temp + "' = seminargruppen.seminargruppenbezeichnung AND seminargruppen.seminargruppennummer = lehrauftraege.seminargruppennummer AND lehrauftraege.personennummer = personen.personennummer", "Personen"); combodozenthonorar.DataSource = test.Tables["personen"]; combodozenthonorar.DisplayMember = "personenname"; test.Clear(); } catch {} }
Mein Problem jetzt ist, dass beim ersten auswählen alles wie gewünscht klappt, beim zweiten aber eine Exception an der Stelle
string temp = comboseminargruppe2.Text
kommt. Und zwar folgende:
Eine nicht behandelte Ausnahme des Typs 'System.ArgumentException' ist in system.windows.forms.dll aufgetreten.
Zusätzliche Informationen: Die Items-Auflistung kann nicht geändert werden, wenn die DataSource-Eigenschaft gesetzt ist.