Laden...

Parameter & Variablengültigkeit

Erstellt von typhos vor 17 Jahren Letzter Beitrag vor 17 Jahren 1.927 Views
T
typhos Themenstarter:in
243 Beiträge seit 2006
vor 17 Jahren
Parameter & Variablengültigkeit

Hallo,
bin nicht 100%ig sicher, ob das hier das richtige Forum für die Frage ist...

Also, ich habe eine Klasse geschrieben, die nur für Datenbankzugriffe usw. zuständig ist. Mit dieser Klasse werden Verbindungen auf- und abgebaut und Command-Objekte erzeugt und all das.
In dieser Klasse gibt es z.B. eine Methode (getDataTabele), die ein SQL-Statement entgegen nimmt (als Parameter) und ein DataTable mit den abgerufenen Daten zurückgibt.
Die SQL-Statements sollen aber auch parametrisiert sein können.

Mein Problem ist Folgendes: Wenn ich aus einer anderen Klasse (bzw. einer Methode einer anderen Klasse) die Methode getDataTable mit einem parametrisierten SQL-Statement aufruft, funktioniert das Ganze ja nicht, da die Variablen, die für die Parameter notwendig sind, nur in der aufrufenden Methode gültig sind und nicht in der Datenbank-Klasse, in der das Command-Objekt erzeugt wird.
Wie bekomme ich also die Variablen am besten zum Command-Objekt, ohne für jedes Statement ein Array der Variablen (oder alle Variablen selber) übergeben muss?
Hat jemand vielleicht eine Idee, wie ich das besser lösen könnte?

Vielen Dank schonmal für jede Hilfe!

3.170 Beiträge seit 2006
vor 17 Jahren

Hallo,
vieleicht die Parameter schon vor Aufruf der getDataTabele mit String.Format() in das SQL-Statement einbauen?

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

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

Danke für die Antwort, aber konkatenieren möchte ich nicht, das ist erstens bei vielen Variablen ein Riesenaufwand und zweitens werden NULL-Values nicht abgedeckt. Man müsste also immer unterscheiden, wenn NULL schreibe "WHERE ... IS NULL" ansonsten schreibe "WHERE ... = ...". Bei Parametern ist der Fall ja schon mit abgedeckt...

3.170 Beiträge seit 2006
vor 17 Jahren

Hallo,
Du hast recht, daseigent sich eher für einfache Fälle. Aber dann wirst Du um eine Übergabe Deiner Parameter nicht herumkommen.
Btw was ist denn so schlimm daran, ein Array zu übergeben?

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

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

Besonders schlimm ist es nicht, aber umständlich. Denn ich müsste ja so in jeder Methode ein Array zusammenbauen, die alle Variablen für die Parameter enthält. Das ist eben auswendig und eine Fehlerquelle, die ich gern vermeiden würde...

L
497 Beiträge seit 2006
vor 17 Jahren

Wenn Du Arrays verwendest, müssten es wahrscheinlich sogar zwei sein: Zum einen die Feldbezeichner und zum anderen deren Werte.

Sarkusmus ist, wenn nichts mehr hilft, außer Lachen.

3.170 Beiträge seit 2006
vor 17 Jahren

Man könnte auch ein Interface ISQLParameters machen, und die aufrufende Klasse implementiert das Interface, und der Funktion getDataTable übergibst du dann das Interface in Form von this. Dann müssten allerdings die lokalen Variablen der aufrufenden Funktion zu Membern der Klasse werden.

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

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

Hmm, wäre 'ne Möglichkeit. Aber wozu das Interface? Ich kann doch auch einfach so this übergeben und so die Membervariablen nutzen... oder nicht?

3.170 Beiträge seit 2006
vor 17 Jahren

Eigentlich schon. Aber wenn Du mal 'ne andere Klasse schreiben willst, die das auch nutzen soll, ist es besser über ein Interface, das jeweils implementiert wird. Ansonsten wärst Du ja entweder typgebunden oder müsstest für die Erweiterbarkeit den this als object übergeben und dann in Deiner getDataTable auf irgendwas entsprechendes casten.. aber auf was? daher ist ein Interface eher zu empfehlen.

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

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

Das stimmt natürlich, Danke!

Das wäre ja schonmal eine Möglichkeit. Eine andere könnte vielleicht sein, nicht das SQL-Statement an die DB-Klasse zu übergeben, sondern das fertige Command-Objekt. Müsste man sich nur überlegen, wie man das am besten erstellt (ohne das in jeder Klasse bzw. Methode explizit zu tun).
Hat dazu vielleicht noch jemand eine Idee?

T
68 Beiträge seit 2006
vor 17 Jahren

Ich bin mir nicht sicher ob du das meinst aber ein Singleton Command Objekt müsste das lösen. und in der Klasse jeweiligen Klasse brauchst du nur mehr eine Referenz auf das Singelton Objekt