Feedback

C# - SimpleDb

Veröffentlicht von am 12/4/2007
(1 Bewertungen)
Mit SimpleDb können Datenbankabfragen leicht und komfortabel ausgelesen werden.
Der SimpleDbList wird einfach ein DbDataReader im Konstruktor übergeben. (Das funktioniert mit allen von DbDataReader abgeleiteten Klassen wie, OdcbDataReader oder OleDbDataReader).
Die Liste liest alle Zeilen aus und speichert jede in einem eigenen Objekt ab.
Der Zugriff auf die Spalten erfolgt einfach über die Spaltennamen, wie sie in der Datenbank vorhanden sind.

using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
using System.Data.Common;

namespace SimpleDb
{
    /// <summary>
    /// Ein Klasse zum Speichern einer Zeile aus einer Datenbankabfrage.
    /// Der Zugriff auf die Daten erfolgt über einen Index in Form einer Zeichenkette.
    /// </summary>
    public class SimpleDbObject
    {
        /// <summary>
        /// Speichert die Feldnamen und dazugehörige Werte
        /// </summary>
        private Hashtable m_Data;

        /// <summary>
        /// Erzeugt ein leeres SimpleDbObject
        /// </summary>
        public SimpleDbObject()
        {
            m_Data = new Hashtable();
        }

        /// <summary>
        /// Gibt den Inhalt des Feldes mit der Bezeichnung fieldName zurück oder setzt ihn.
        /// </summary>
        /// <param name="fieldName">Der Feldname, der angesprochen werden soll</param>
        /// <returns>Ein object, wenn es Daten zum gesuchten Feldnamen gibt oder NULL,
        /// wenn das Feld nicht existiert oder der gespeicherte Wert in der Datenbank NULL ist</returns>
        public object this[string fieldName]
        {
            get
            {
                object data = m_Data[fieldName.ToUpper()];
                if (data != null)
                {
                    if (data == DBNull.Value)
                    {
                        return null;
                    }
                    return data;
                }
                return null;
            }
            set
            {
                m_Data[fieldName] = value;
            }
        }

        /// <summary>
        /// Fragt ab, ob das ein bestimmtes Feld existiert
        /// </summary>
        /// <param name="fieldName">Der Feldname, dessen Existenz gesucht werden soll</param>
        /// <returns>TRUE, wenn das Feld existiert, sonst FALSE</returns>
        public bool FieldExists(string fieldName)
        {
            return m_Data.ContainsKey(fieldName.ToUpper());
        }

        /// <summary>
        /// Gibt eine ICollection zurück, die alle Feldnamen enthält
        /// </summary>
        public ICollection FieldNames
        {
            get
            {
                return m_Data.Keys;
            }
        }                
    }

    /// <summary>
    /// Eine Klasse zum Speichern von mehreren SimpleDbObjects.
    /// </summary>
    public class SimpleDbObjectList : ArrayList
    {

        /// <summary>
        /// Erzeugt eine neue leere SimpleDbObjectList
        /// </summary>
        public SimpleDbObjectList()
        {
        }

        /// <summary>
        /// Erzeugt eine neue SimepleDbObjectList und liest dabei ein komplettes Abfrageergebnis ein
        /// </summary>
        /// <param name="reader">Ein DbDataReader der durch DbCommand.ExecuteReader() erstellt wurde.</param>
        /// <exception cref="SimpleDb.SimpleDbException">Tritt ein, wenn ein Fehler beim Lesen aus dem DbDataReader auftritt</exception>
        public SimpleDbObjectList(DbDataReader reader)
        {
            try
            {
                while (reader.Read())
                {
                    SimpleDbObject obj = NewObject();
                    // Felder durchiterieren und Inhalte im Hashtable speichern
                    for (int iFieldPosition = 0; iFieldPosition < reader.FieldCount; iFieldPosition++)
                    {
                        obj[reader.GetName(iFieldPosition).ToUpper()] = reader[iFieldPosition];
                    }
                    this.Add(obj);
                }
            }
            catch (Exception ex)
            {
                throw new SimpleDbException("Fehler beim Aufbau der Liste.\nMeldung der Datenbankschnittstelle:\n" + ex.Message, ex);
            }
        }

        /// <summary>
        /// Gibt eine neue Instanz eines SimpleDbObjects zurück.
        /// Diese Methode muss von abgeleiteten Klassen überschrieben werden
        /// </summary>
        /// <returns>neues SimpleDbObject</returns>
        public virtual SimpleDbObject NewObject()
        {
            return new SimpleDbObject();
        }

        /// <summary>
        /// Fügt der Liste ein neues SimpleDbObject hinzu
        /// </summary>
        /// <param name="dataRow">Das SimpleDbObject, dass der Liste hinzugefügt werden soll</param>
        public void Add(SimpleDbObject dataRow)
        {
            base.Add(dataRow);
        }

        /// <summary>
        /// Gibt das Objekt an einer bestimmten Position zurück
        /// </summary>
        /// <param name="position">Der null-basierte Index, an dem das SimpleDbObject zurückgegeben werden soll</param>
        /// <returns>Das Objekt an der gewünschten Position</returns>
        public SimpleDbObject GetAt(int position)
        {
            return (SimpleDbObject)this[position];
        }
    }

    /// <summary>
    /// Stellt Fehler dar die beim Verwenden der SimpleDb-Klassen auftreten können
    /// </summary>
    public class SimpleDbException : Exception
    {
        /// <summary>
        /// Erzeugt eine neue SimpleDbException und legt den Meldungstext fest
        /// </summary>
        /// <param name="message">Der Meldungstext der Exception</param>
        public SimpleDbException(string message)
            : base(message)
        {
        }

        /// <summary>
        /// Erzeugt eine neue SimpleDbException und legt den Meldungstext und die
        /// Exception der Fehlerursache fest.
        /// </summary>
        /// <param name="message">Der Meldungstext der Exception</param>
        /// <param name="innerException">Die Exception die der Grund für diese Exception ist oder NULL, wenn keine Exception voraus ging</param>
        public SimpleDbException(string message, Exception innerException)
            : base(message, innerException)
        {
        }
    }
}
Abgelegt unter Datenbank, Abfrage, SQL, DataReader, .

Kommentare zum Snippet

 

Logge dich ein, um hier zu kommentieren!