Запрос не возвращает все данные из базы данных - PullRequest
0 голосов
/ 23 апреля 2020

У меня есть C# 4.0 WinForms App, использующее SQL База данных Server 2012.

В одной из моих форм я выбираю диапазон дат из MonthCalendar. В запросе, использующем SqlDataAdapter, запрос должен возвращать 4-имен людей из таблицы.

После заполнения DataTable "for" l oop успешно вытягивает имя. На следующей итерации он также извлекает имя второго человека из таблицы. Однако на 3-й итерации он снова извлекает имя 2-го лица и не получает оставшиеся 2-имена.

Используя SSMS, я вижу все 4-имен людей, которых я запрашиваю. Если я использую запрос ниже в SSMS, я снова получаю все 4 имени. У кого-нибудь есть идея, почему приведенный ниже код не может вернуть все 4 имени, но возвращает предыдущее имя?

Вот код, который я использую для запроса к SQL базе данных сервера.

private string ReturnPerson(string dStart, string dEnd)
{
    string myPerson = "";

    try
    {
        using (SqlConnection conn = new SqlConnection(@"..."))
        {
            conn.Open();
            using (SqlDataAdapter adap = new SqlDataAdapter("SELECT person, scheduledDate FROM Assignments WHERE scheduledDate BETWEEN @start AND @end ORDER BY scheduledDate ASC", conn))
            {
                adap.SelectCommand.Parameters.Add("@start", SqlDbType.NVarChar).Value = dStart;
                adap.SelectCommand.Parameters.Add("@end", SqlDbType.NVarChar).Value = dEnd;

                using (DataTable dt = new DataTable())
                {
                    adap.Fill(dt);
                    for (int i = 0; i < dt.Rows.Count - 1; i++)
                    {
                        DataRow row = dt.Rows[i];
                        DataRow nextRow = dt.Rows[i + 1];

                        if (personRowCounter == 0)//rowCounter declared globaly
                        {
                            myPerson = row.Field<string>("person").ToString();
                            personRowCounter++;
                            return myPerson;
                        }
                        else if (personRowCounter > 0)
                        {
                            myPerson = nextRow.Field<string>("person").ToString();
                            personRowCounter++;
                            return myPerson;
                        }
                    }
                }
            }
        }
    }
    catch (SqlException ex) { MessageBox.Show(ex.Message); }
    catch (System.Exception ex) { MessageBox.Show(ex.Message); }
    return myPerson;
}

Ответы [ 3 ]

1 голос
/ 23 апреля 2020

Если вы начнете с personRowCounter = 0, то первый вызов вернет строку 0 как personRowCounter = 0 и i = 0, и он установит personRowCounter = 1 Затем следующий вызов вернет строку 1 как personRowCounter> 0 и i = 0 и он установит personRowCounter = 1 и все вызовы после этого вернут строку 1 как personRowCounter> 0, а l oop всегда начинается с 0

0 голосов
/ 25 апреля 2020

Основываясь на комментариях выше, я нашел решение. Мне нужно было настроить строки DataRow, как показано ниже. Это позволило мне получить оставшиеся данные.

private string ReturnPerson(string dStart, string dEnd)
{
    string myPerson = "";

    try
    {
        using (SqlConnection conn = new SqlConnection(@"..."))

        conn.Open();
        using (SqlDataAdapter adap = new SqlDataAdapter("SELECT person, scheduledDate FROM Assignments WHERE scheduledDate BETWEEN @start AND @end ORDER BY scheduledDate ASC", conn))
        {
            adap.SelectCommand.Parameters.Add("@start", SqlDbType.NVarChar).Value = dStart;
            adap.SelectCommand.Parameters.Add("@end", SqlDbType.NVarChar).Value = dEnd;

            using (DataTable dt = new DataTable())
            {
                adap.Fill(dt);
                for (int i = 0; i < dt.Rows.Count - 1; i++)
                {
                    DataRow row0 = dt.Rows[i];
                    DataRow row1 = dt.Rows[i + 1];
                    DataRow row2 = dt.Rows[i + 2];
                    DataRow row3 = dt.Rows[i + 3];
                    if (dt.Rows.Count > 4)
                    {
                        DataRow row4 = dt.Rows[4];
                    }

                    if (personRowCounter == 0)//rowCounter declared globaly
                    {
                        myPerson = row0.Field<string>("person").ToString();
                        personRowCounter++;
                        return myPerson;
                    }
                    else if (personRowCounter == 1)
                    {
                        myPerson = row1.Field<string>("person").ToString();
                        personRowCounter++;
                        return myPerson;
                    }
                    else if (personRowCounter == 2)
                    {
                        myPerson = row2.Field<string>("person").ToString();
                        personRowCounter++;
                        return myPerson;
                        "etc.";
                    }
                }
            }
        }
    }
    catch (SqlException ex) { MessageBox.Show(ex.Message); }
    catch (System.Exception ex) { MessageBox.Show(ex.Message); }
    return myPerson;
}
0 голосов
/ 23 апреля 2020

Я не уверен, что вы намерены здесь. Но я считаю, что проблема заключается в

 DataRow nextRow = dt.Rows[i + 1];

Это вызовет исключение, когда я указываю на последнюю строку. Потому что [i + 1] будет индексироваться после конца dt.rows.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...