Ungültiger Versuch, Read aufzurufen, wenn der Reader geschlossen ist

Ich habe einen ungültigen Versuch, Read aufzurufen, wenn der Reader geschlossen ist. Fehler beim Ausführen eines dreistufigen Projekts in C # -Sprache. Ich versuche, die Adressdatenspalte abzurufen, indem ich zwei Tabellen miteinander verbinde und in einer Dropdown-Liste anzeige. Hier ist meine Datenzugriffsebene:

    public List<Distribution> getDistributionAll()
    {
        List<Distribution> distributionAll = new List<Distribution>();
        string address;
        SqlDataReader dr = FoodBankDB.executeReader("SELECT b.addressLineOne FROM dbo.Beneficiaries b INNER JOIN dbo.Distributions d ON d.beneficiary = b.id");

        while (dr.Read())
        {
            address = dr["addressLineOne"].ToString();
            distributionAll.Add(new Distribution(address));
        }

        return distributionAll;
    }

Und das ist meine FoodBankDB-Klasse:

   public class FoodBankDB
{
    public static string connectionString = Properties.Settings.Default.connectionString;
    public static SqlDataReader executeReader(string query)
    {
        SqlDataReader result = null;
        System.Diagnostics.Debug.WriteLine("FoodBankDB executeReader: " + query);
        SqlConnection connection = new SqlConnection(connectionString);
        SqlCommand command = new SqlCommand(query, connection);
        connection.Open();
        result = command.ExecuteReader();
        connection.Close();
        return result;
    }

Ich habe diese in zwei Klassen unterteilt, sodass ich bei jeder Änderung meiner Verbindungszeichenfolge das gesamte Projekt problemlos durch Ändern der FoodBankDB-Klasse ändern kann.

Und das ist meine Business-Logik-Ebene:

public List<Distribution> getAllScheduledDistribution()
    {
        List<Distribution> allDistribution = new List<Distribution>();
        Distribution distributionDAL = new Distribution();
        allDistribution = distributionDAL.getDistributionAll();
        return allDistribution;
    }

Und zu guter Letzt meine Präsentationsebene:

List<Distribution> scheduledList = new List<Distribution>();
scheduledList = packBLL.getAllScheduledDistribution();
ddlScheduleList.DataSource = scheduledList;
ddlScheduleList.DataTextField = "address";
ddlScheduleList.DataValueField = "address";
ddlScheduleList.DataBind();

Es hat gut funktioniert, wenn ich die Datenzugriffsebene und die Verbindungszeichenfolgenklasse nicht aufgeteilt habe. Weiß jemand, wie man diesen Fehler behebt?

Danke im Voraus.

Aktualisierter Teil

        public static string GetConnectionString()
    {
        return connectionString;
    }

Antworten auf die Frage(2)

Ihre Antwort auf die Frage