MySqlDataReader Resultat "generisch" speichern

ChristianR1905

Grünschnabel
Hallo,
ich habe ein vermutlich sehr einfaches Problem, komme aber grad nicht auf eine elegante Variante. Ich frage eine Tabelle nach Felder ab (immer mit * in der aktuellen Version).

Nun weiß ich vorher nicht welche Felder ich zurück kriege, das hängt stark von der Tabelle ab. Ich weiß nur eins, es sind ziemlich viele. Ich weiß, von der Performance her sollte ich nur die holen die ich brauche, aber im aktuellen Entwicklungsstadium ist mir das zu mühsam.

Ich weiß schon wie ich die Namen der Spalten erhalte:

Code:
 for (int i = 0; i < reader.FieldCount; i++)  
Console.WriteLine("ColHeader" + reader.GetName(i));

Auch der Datentyp der Spalte ist kein Problem:
Code:
for (int i = 0; i < reader.FieldCount; i++)
 Console.WriteLine("Type " + 
reader.GetProviderSpecificFieldType(i));

Auch eine Hilfsfunktion die mit dem Index für einen Namen gibt hab ich schon:
Code:
public static int NameToInt(string name, MySqlDataReader reader)
        {
            for (int i = 0; i < reader.FieldCount; i++)
                if (reader.GetName(i) == name) return i;
            return -1;
        }

Und zu guter Letzt hab kann ich natürlich manuell Folgendes machen:
Code:
uid     = dbEntry.GetInt32(
DBConnector.NameToInt("uid", dbEntry)
);

Aber, wie der Experte sicher schon merkt, das ist unglaublich unelegant. Ich würde gerne einfach die eine Zeile aus der Datenbank in einer Art Datenstruktur speichern wo ich per String als Key auf gemischte Objekte zugreifen kann. Ok, ich hab grad ne Idee gehabt.. Ich poste das dennoch einmal, ich find die Beispiele oben ganz nett. Wenn ich meine Idee ausprobiert hab meld ich mich nochmal...
 
So,
folgender Code vermittelt hoffentlich einen Eindruck davon was ich machen möchte, ist aber sicher grausam Newbie Style... Das Switch hab ich nicht besser hingekriegt, und vermutlich geht das was ich hier veranstalte auf einer Zeile... Vorschläge sind immer willkommen...
Code:
class DBResult
    {
        public Dictionary<string, string> stringValues = new Dictionary<string, string>();
        public Dictionary<string, int> intValues = new Dictionary<string, int>();
        public Dictionary<string, string> objectValues = new Dictionary<string, string>();

        public DBResult(MySqlDataReader dbEntry)
        {
            for (int i = 0; i < dbEntry.FieldCount; i++)
            {
                switch(dbEntry.GetProviderSpecificFieldType(i).ToString())
                {
                    case "System.int32":
                        if (!dbEntry.IsDBNull(i)) intValues.Add(dbEntry.GetName(i), dbEntry.GetInt32(i));
                        break;
                    case "System.String":
                        if (!dbEntry.IsDBNull(i)) stringValues.Add(dbEntry.GetName(i), dbEntry.GetString(i));
                        break;
                    default:
                        if (!dbEntry.IsDBNull(i)) objectValues.Add(dbEntry.GetName(i), dbEntry.GetString(i));
                        break;
                }
            }
        }
    }

PS: Ist das Code Fenster eingentlich immer so schmal.. das ist ja grauenhaft, hat da schonmal jemand Bescheid gesagt...
 
Hallo Christian,

leider verstehe ich persönlich nicht was du da genau vor hast. Du hast 3 Dictionarys mit denen ich nichts anzufangen wüsste. Vielleicht kannst du kurz erläutern was du anschließend damit vor hast?

Ich bin mir nicht sicher, aber vielleicht hilft es dir ja weiter wenn du dir statt dem DataReader eine DataTable erstellst. Hier hast du einfachen Zugriff auf alle Zeilen und Spalten und du bekommst es sogar typisiert geliefert...

Code:
MySqlCommand readCommand = new MySqlCommand(“SELECT * FROM test”, connection);
MySqlDataAdapter adapter = new MySqlDataAdapter(readCommand);
DataTable datatable = new DataTable();  

adapter.Fill(datatable);
for (int x = 0; x < datatable.Rows.Count; x++)
{
    object[] values = datatable.Rows[x].ItemArray;
}
 
Hi,
vielen Dank für die Antwort... Ja, ich sollte erst weiter in meinem C# Buch lesen und dann erst experimentieren. Ich habe gestern abend dann auch noch begeistert die DataTables entdeckt.

Um ehrlich zu sein bin ich sogar noch einen Schritt "weiter", ich werde mir heute mal LINQ mit Mysql anschauen. Das sieht sehr vielversprechend aus, da gibt es eine Implementierung die mit mit etwas Glück aus meiner MySQL direkt die entsprechenden Klassen erzeugt.

Sehr interessant das Ganze, und so elegant..
Jetzt nur noch Daumen drücken das es mit MySQL läuft, ich kann Typo3 schlecht auf MSSQL umstellen :)
 
Zurück