Какой лучший способ выбрать из таблицы с двумя условиями в одном столбце? - PullRequest
0 голосов
/ 30 марта 2020

Я пытался выбрать в базу данных с тремя условиями, и два из них в одном столбце.

У меня есть flowlayoutpanel с usercontrol, и я не могу просмотреть все данные с разными значениями из тот же столбец.

Я пытался

SELECT borrowID, studentID, bookTitle, dateBorrowed, dueDate, status  FROM tblBorrowedBook WHERE status = 'Not Returned' AND status = 'Overdue' AND studentNum = @studentNum

, но, к сожалению, не работает.

Я также пытался

    public void BooksOnHand()
    {
        ucBooksOnHand uc = new ucBooksOnHand(this);
        flowLayoutPanel1.Controls.Clear();
        cn.Open();
        cm = new SqlCommand("SELECT borrowID, studentID, bookTitle, dateBorrowed, dueDate, status  FROM tblBorrowedBook WHERE status = 'Not Returned' AND studentNum = @studentNum", cn);
        cm.Parameters.AddWithValue("@studentNum", frmissue.lblStudNo.Text);
        dr = cm.ExecuteReader();
        while (dr.Read())
        {
            //ucBooksOnHand uc = new ucBooksOnHand(this);
            uc.Dock = DockStyle.Top;
            uc.lblBorrowID.Text = dr["borrowID"].ToString();
            uc.lblStudentID.Text = dr["studentID"].ToString();
            uc.lblBookName.Text = dr["bookTitle"].ToString();
            uc.lblDateBorrowed.Text = Convert.ToDateTime(dr["dateBorrowed"]).ToString("MM/dd/yyyy");
            uc.lblDueDate.Text = Convert.ToDateTime(dr["dueDate"]).ToString("MM/dd/yyyy");
            uc.lblStatus.Text = dr["status"].ToString();
            uc.dtDueDate.Value = Convert.ToDateTime(dr["dueDate"]);
            flowLayoutPanel1.Controls.Add(uc);
        }
        dr.Close();
        cn.Close();
    }

    public void BooksOverdue()
    {
        cn.Open();
        cm = new SqlCommand("SELECT borrowID, bookTitle, studentID, dateBorrowed, dueDate, status  FROM tblBorrowedBook WHERE status = 'Overdue' AND studentNum = @studentNum", cn);
        cm.Parameters.AddWithValue("@studentNum", frmissue.lblStudNo.Text);
        dr = cm.ExecuteReader();
        while (dr.Read())
        {
            ucBooksOnHand uc = new ucBooksOnHand(this);
            uc.Dock = DockStyle.Top;
            uc.lblBorrowID.Text = dr["borrowID"].ToString();
            uc.lblStudentID.Text = dr["studentID"].ToString();
            uc.lblBookName.Text = dr["bookTitle"].ToString();
            uc.lblDateBorrowed.Text = Convert.ToDateTime(dr["dateBorrowed"]).ToString("MM/dd/yyyy");
            uc.lblDueDate.Text = Convert.ToDateTime(dr["dueDate"]).ToString("MM/dd/yyyy");
            uc.lblStatus.Text = dr["status"].ToString();
            uc.dtDueDate.Value = Convert.ToDateTime(dr["dueDate"]);
            flowLayoutPanel1.Controls.Add(uc);
        }
        dr.Close();
        cn.Close();
    }

Выше код работал для меня, но я ищу лучшее и простое решение для моей проблемы.

Вот некоторые данные из таблицы

borrowID    studentID   bookID  studentNum      bookTitle   dateBorrowed  dueDate    returnedDate   status
10          1           1       2020-01-0001    Worthless   2020-03-30   2020-04-06  Mar 30 2020    Returned
11          1           1       2020-01-0001    Worthless   2020-03-23   2020-03-27  Mar 30 2020    Returned
12          1           2       2020-01-0001    Heartless   2020-03-30   2020-04-06                 Not Returned
13          1           1       2020-01-0001    Worthless   2020-03-15   2020-03-28                 Overdue

И я хочу показать все имеющиеся у меня книги студента, который еще не вернулся и просрочен.

Пример вывода, который я хочу:

Books In Possesion:

Book Name   Status
----------|-------------
Heartless | Not Returned
Worthless | Overdue

1 Ответ

4 голосов
/ 30 марта 2020

Вы не можете иметь AND в одном столбце с двумя разными значениями. Вам нужно использовать OR для них в квадратных скобках, например:

SELECT ... WHERE (status = 'Not Returned' OR status = 'Overdue') AND studentNum = @studentNum

Другой, возможно, лучший способ - использовать оператор IN. Конечно, лучше, если у вас есть более двух предметов для проверки

SELECT ... WHERE status IN('Not Returned', 'Overdue') AND studentNum = @studentNum
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...