Laden...

Was machen wenn man nicht weiß welcher Typ der Rückgabe wert ist

Erstellt von wadehade vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.197 Views
W
wadehade Themenstarter:in
2 Beiträge seit 2018
vor 5 Jahren
Was machen wenn man nicht weiß welcher Typ der Rückgabe wert ist

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

16.834 Beiträge seit 2008
vor 5 Jahren

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:

  • CustomerMySqlDbRepository
  • CustomerAccessDbRepository

Beide Implementierungen haben in diesem Fall ein gemeinsames Interface, zB

  • ICustomerRepository

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 😉

1.029 Beiträge seit 2010
vor 5 Jahren

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

16.834 Beiträge seit 2008
vor 5 Jahren

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.

W
wadehade Themenstarter:in
2 Beiträge seit 2018
vor 5 Jahren

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