Hallo,
ich möchte nur mal gerne wissen, ob das so klappt, was ich mir vorstelle. Ich hab zwar schon gesucht, aber nichts zu dem Thema gefunden. Vielleicht hat jemand von Euch einen guten Vorschlag...
Ich will eine datenbankunabhängige Software schreiben. Am Anfang wählt der Benutzer aus, welchen Datenbanktyp er nutzen will.
Um das festzuhalten benutze ich folgenden Code:
IConnection _conn = new <meineKlasse>;
IDataAdapter _dap = new <meineKlasse>;
Ich weiß also nicht, welche Klasse genommen wird. Möchte ich nun irgendwo eine zweites Objekt IDataAdapter, mit demselben Typ mit dem _dap initialisiert wurde, erstellen, würde das so z.B. gehen ?
IDataAdapter _dap2 = _dap.GetType();
_dap2 sollte natürlich in keinster Weise eine Referenz auf _dap haben =).
Ist mein Gedankengang so richtig oder nicht? bevor ich anfange das selbst auszuprobieren, wollte ich vorher einfach frech Euch im Vorfeld fragen 😁
Wer noch um die Zeit wach und aktiv und online ist, allen einen schönen Abend..
Gruß Olli
Das funktioniert so nicht. GetType() gibt ein Type-Objekt zurück, welches den abgefragten Typ genau beschreibt. Dein Beispielcode würde eine InvalidCastException auslösen.
Trotzdem ist der Gedanke an GetType nicht falsch. Du kannst mit GetType().Name z.B. den Klassennamen abfragen. Vergiss aber nicht, dass nicht nur Connection, Command und DataAdapter datenbankspezifisch sind, sondern auch der SQL-Code, die Art, wie Parameter übergeben werden (z.B. mit @xxx bei SQL-Server und mit ? bei OLEDB) und die Möglichkeit gespeicherte Prozeduren ausführen zu können oder nicht. Datenbankunabhingigkeit ist ein Mythos!
Du kannst aber die nötigen Anpassungen für die einzelnen Datenbanksysteme auf ein Minimum reduzieren. Am besten für jede unterstützte Technologie eine eigene Klasse anlegen und alle eine gemeinsame allgemeine Schnittstelle implementieren lassen. Dann kannst Du kleinen aber feinen Unterschiede zentral implementieren. Einziges Problem bleibt der SQL-Code. Da wäre der einzig gangbare Weg, einen Referenz-SQL-Dialekt festzulegen und alle anderen darauf zu mappen.
Guten Abend Rainbird,
achso, ich krieg nur den Namen zurück. Das wußte ich jetzt nicht. Mit dem SQL-Befehlen wollte ich es mir auch ganz einfach machen. Da ich eh nur komplette Tabellen lade, wollte ich ganz einfach die Update() Funktion benutzen. Da wird das ja automatisch generiert.
Bloß dazu müsste ich wissen, welche Klasse benutzt wird...
Na gut, dann muß ich das mal so probieren, was du geschrieben hast
Danke dir
Hast Du Dir schon den Namespace System.Data.Common angeschaut?
Ev. könntest Du mit .Clone die Objekte clonen (musst aber aufpassen dass kein Schaf dabei rauskommt 😄)
Ein anderer Weg:
IDbDataAdapter iadapSource= igend ein Adapter
IDbDataAdapter iadapNewAdapter=Activator.CreateInstance(idapSource.GetType());
.... funzt allerdings so nur wenn ein parameterloser Constructor existiert ...
Guten Morgen alle zusammen ....
Original von Meli
Hast Du Dir schon den Namespace System.Data.Common angeschaut?
Das hab ich mir mal durchgelesen und ausprobiert. Komischerweise mag der Treiber von MySQL das Namesspace nicht. Aber die Beschreibung ist echt gut.
Programmierhans
Ev. könntest Du mit .Clone die Objekte clonen (musst aber aufpassen dass kein Schaf dabei rauskommt großes Grinsen )Ein anderer Weg:
IDbDataAdapter iadapSource= igend ein Adapter IDbDataAdapter iadapNewAdapter=Activator.CreateInstance(idapSource.GetType());
Krieg ich den keinen Ärger wegen dem Klonen? Soweit ich weiß, ist das ja verboten in Deutschland und es ist auch nicht exakt festgelegt, was man NICHT klonen darf 😉
So, werde mal von Euren vielen Lösungsvorschlagen alle mal ausprobieren und das nehmen was mir am besten gefällt oder was meinen Erwartungen am ehesten nahe kommt.
Gruß Olli
Aber ich werde jetzt erstmal folgenden Code ausführen: 🙂
if (Lunge.GetFeeling() == entzug)
{
Raucherzimmer.RauchenGehen();
}
Original von Unikum
Aber ich werde jetzt erstmal folgenden Code ausführen: 🙂
if (Lunge.GetFeeling() == entzug) { Raucherzimmer.RauchenGehen(); }
Müsste das nicht so heissen ?
if (Lunge.Untersuchung.Krebs=true)
{
ZeitZumSargAussuchen=DateTime.Now;
}