Не все пути кода возвращают значение в цикле - PullRequest
0 голосов
/ 15 декабря 2018

Я сделал следующий код, чтобы заполнить список данными из базы данных.

 public List<Transactie> FillTransacties()
    {
        try
        {
            SqlConnection connection = new SqlConnection(connectionString);
            connection.Open();

            SqlCommand cmd = new SqlCommand("SELECT transactieID, opdrachtID, medewerkerID, soort, datum, bedrag FROM Financien", connection);
            SqlDataReader transactieinformatie = cmd.ExecuteReader();

            List<Transactie> transacties = new List<Transactie>();

            while (transactieinformatie.Read())
            { 
                    string transactieID = transactieinformatie["transactieID"].ToString();
                    string opdrachtID = transactieinformatie["opdrachtID"].ToString();
                    string medewerkerID = transactieinformatie["medewerkerID"].ToString();
                    string soort = transactieinformatie["soort"].ToString();
                    string datum = transactieinformatie["datum"].ToString();
                    string bedrag = transactieinformatie["bedrag"].ToString();
                    Transactie transactie = new Transactie(transactieID, opdrachtID, medewerkerID, soort, datum, bedrag);
                    transacties.Add(transactie);
                    connection.Close();
                    return transacties;
            }
        }
        catch (InvalidCastException ICE)
        {
            MessageBox.Show("De data in de database is incorrect", ICE.Message);
            return new List<Transactie>();
        }
        catch (Exception e)
        {
            MessageBox.Show("Er is een onbekende error opgetreden.", e.Message);
            return new List<Transactie>();
        }
    }

Теперь я знаю, в чем проблема, я возвращаю значения в цикле while.Проблема, тем не менее, когда я пытаюсь «Вернуть транзакционность»;вне цикла while список заполняется только значением 1.

Мой вопрос: как мне решить эту ошибку таким образом, чтобы база данных заполнялась каждой строкой в ​​базе данных?

Заранее спасибо.

- Если у вас есть вопросы, касающиеся имен, пожалуйста, сделайте это, потому что это на голландском языке.- Советы относительно исключений тоже очень приветствуются, потому что я очень новичок в программировании.- Также приветствуются советы относительно «лучших практик».

Ответы [ 3 ]

0 голосов
/ 15 декабря 2018

Удалите каждую строку кода после вашей SqlCommand (например, sqldatareader и далее) и замените ее на:

DataTable dt = new DataTable();
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(dt);

Теперь у вас будет объект DataTable, представляющий данные вашей базы данных (все из них).Вы можете перебирать его как набор строк и работать с данными

Вскоре после этого вам следует прочитать учебник Entity Framework (от Microsoft) и поработать над игнорированием этого метода полного извлечения данных из базы данных.(на данный момент; не стесняйтесь вернуться к нему, когда вы станете более опытным, но это очень низкоуровневый способ работы и не способствует написанию хорошего, хорошо инкапсулированного, надежного и производительного кода, особенно в качестве новичка) ..

0 голосов
/ 15 декабря 2018

На самом деле, когда вы вернетесь в while statement, цикл был разорван, вы должны учитывать это, а также обрабатывать closing the connection.Вам нужно немного изменить свой код, как:

public List<Transactie> FillTransacties()
{
    try
    {
        SqlConnection connection = new SqlConnection(connectionString);
        connection.Open();

        SqlCommand cmd = new SqlCommand("SELECT transactieID, opdrachtID, medewerkerID, soort, datum, bedrag FROM Financien", connection);
        SqlDataReader transactieinformatie = cmd.ExecuteReader();

        List<Transactie> transacties = new List<Transactie>();

        while (transactieinformatie.Read())
        { 
                string transactieID = transactieinformatie["transactieID"].ToString();
                string opdrachtID = transactieinformatie["opdrachtID"].ToString();
                string medewerkerID = transactieinformatie["medewerkerID"].ToString();
                string soort = transactieinformatie["soort"].ToString();
                string datum = transactieinformatie["datum"].ToString();
                string bedrag = transactieinformatie["bedrag"].ToString();
                Transactie transactie = new Transactie(transactieID, opdrachtID, medewerkerID, soort, datum, bedrag);
                transacties.Add(transactie);  
        }
        return transacties;
    }
    catch (InvalidCastException ICE)
    {
        MessageBox.Show("De data in de database is incorrect", ICE.Message);
        return new List<Transactie>();
    }
    catch (Exception e)
    {
        MessageBox.Show("Er is een onbekende error opgetreden.", e.Message);
        return new List<Transactie>();
    }
    finally
    {
        connection.Close();
    }
}
0 голосов
/ 15 декабря 2018

Вы должны переписать свой код с помощью using операторов.Они автоматически очистят хранилище данных, команду и соединение после завершения кода:

using(SqlConnection connection = new SqlConnection(connectionString))
{
    connection.Open();
    using (SqlCommand cmd = new SqlCommand("SELECT transactieID, opdrachtID, medewerkerID, soort, datum, bedrag FROM Financien", connection))
    using (SqlDataReader transactieinformatie = cmd.ExecuteReader())
    {
        List<Transactie> transacties = new List<Transactie>();
        while (transactieinformatie.Read())
        { 
                string transactieID = transactieinformatie["transactieID"].ToString();
                string opdrachtID = transactieinformatie["opdrachtID"].ToString();
                string medewerkerID = transactieinformatie["medewerkerID"].ToString();
                string soort = transactieinformatie["soort"].ToString();
                string datum = transactieinformatie["datum"].ToString();
                string bedrag = transactieinformatie["bedrag"].ToString();
                Transactie transactie = new Transactie(transactieID, opdrachtID, medewerkerID, soort, datum, bedrag);
                transacties.Add(transactie);
        }
        return transacties;
    }
}

Поэтому я удалил соединение, закрытое из цикла (чтобы вы могли продолжить чтение дополнительной информации), и теперь возвращаюсписок вне цикла.

...