Hallo
Danke an das Forum bis jetzt habe ich immer eine Lösung für die "kleinen" Probleme im Forum gefunden, doch nun weiß ich nicht mehr wonach ich suchen soll.
folgende Herausforderung ich habe 2 Datenbanken eine Acces und ein MySQL. (würde mir wünschen 2 MySQL zu haben aber leider bekommt man nicht immer ein Eis wenn man eins will)
Jetzt möchte ich für die Datenbank zugriffe kein doppelten Code haben, daher habe ich den Verbindungsaufbau gesplittet, je nach Datenbank ist z.B. der Reader, mit dem verarbeiten der DB Infos, der selbe. Schwierig zu erklären.
private ??????????? openConReader(string query)
{
if (acc)
{
String connectionString = @"Provider = Microsoft.ACE.OLEDB.12.0; Data Source = " + _db_pfad + ";Persist Security Info = False;";
conAcc = new OleDbConnection(connectionString);
conAcc.Open();
OleDbCommand Command = new OleDbCommand();
Command.Connection = conAcc;
Command.CommandText = query;
OleDbDataReader reader = Command.ExecuteReader();
return reader;
}
else if(sql){
String connectionString = "SERVER=192.168.178.xx;DATABASE=xxDB;UID=db_user;PWD=db_passwd";
conSql = new MySqlConnection(connectionString);
conSql.Open();
MySqlCommand Command = new MySqlCommand();
Command.Connection = conSql;
Command.CommandText = query;
MySqlDataReader reader = Command.ExecuteReader();
return reader;
}
}
public KundenDaten getKunde(string kid, string db_pfad)
{
_db_pfad = db_pfad;
KundenDaten _return = new KundenDaten();
string query = "SELECT * FROM KUNDENDATEN WHERE KUNDEN_ID='" + kid + "';";
var reader = openConReader(query);
reader.Read();
_return.KundenID = reader[0].ToString();
_return.KundenName = reader[1].ToString();
_return.Straße = reader[2].ToString();
_return.HausNr = reader[3].ToString();
_return.PLZ = reader[4].ToString();
_return.Ort = reader[5].ToString();
_return.Ansprechpartner = reader[6].ToString();
_return.TelNr = reader[7].ToString();
_return.EMail = reader[8].ToString();
_return.Land = reader[9].ToString();
conClose();
return _return;
}
Was muss nun beim Rückgabe Typ angegeben werden? es kam ja einmal OleDbDataReader sein und einmal MySqlDataReader.
Wenn es noch ein Link gäbe wo ich bezüglich dieses Problems was lesen kann wäre ganz toll.
Danke schon mal im voraus
Wade
Wenn Dir der Rückgabetyp unbekannt ist, dann ist das ein Design-Problem Deiner Architektur.
Den Weg, den Du da einschlägst, ist auch grundsätzlich falsch.
Du solltest eigene Implementierungen pro Datenbank umsetzen, und nicht in Methoden das Ganze Prüfen.
Im besten Fall hast Du ein:
Beide Implementierungen haben in diesem Fall ein gemeinsames Interface, zB
In diesen Klassen hast Du anschließend die jeweils konkrete Implementierung für die Technologie.
Das Interface deckt die Gemeinsamkeiten ab, zB. eben Entitäten wie einer CustomerEntity als Übergabe- und Rückgabetyp.
Schau Dir auch [Artikelserie] SQL: Parameter von Befehlen an.
Zudem das ADO.NET konzept sowie den Repository Pattern.
Aktuell scheinst Du einfach irgendwie zu programmieren; und das knallt meistes 😉
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Hi,
der größte gemeinsame Nenner beider Klassen wäre dann wohl der DbDataReader.
Allerdings kann man Abt's Aussagen hier nur unterstreichen - du tust dir mit der Vorgehensweise keinen Gefallen sondern fällst nur später auf den Arsch.
LG
Zusatz: mit einem ORM - in diesem Fall zB. Dapper - ersparst Du Dir die gesamte Abhängigkeit an die Datenbanktechnologie.
Es gibt noch weitere wie Entity Framework, Entity Framework Core, NHibernate; ich empfehle aber stets Dapper.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Danke
So schnell hatte ich nicht mit einer Antwort gerechnet.
habe mir schon gedacht das ich das Datenbank abhängig splitten werde.
ein ORM das ist interessant habe noch nie was davon gehört. Werde dann mal anfangen zu lesen.
Grüße und einen schönen Tag noch
Wade