Попытка отфильтровать сетку данных в соответствии с выбранными в выпадающих списках - PullRequest
0 голосов
/ 29 августа 2010

У меня есть страница View Feedback с двумя выпадающими списками для фильтрации сетки ответов на вопросы.1-й список ddList - это Модули. После того, как он выбран, включается 2-й список вопросов ddList, и пользователь может выбрать вопрос, чтобы увидеть ответы на него относительно выбранного модуля, ИЛИ он может выбрать, чтобы увидеть все ответы на все вопросы длявыбранный модуль.

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

Извините, я знаю, что это не самое ясное объяснениено любая помощь будет потрясающей.

Мои таблицы:

CREATE TABLE tblModules
(
Module_ID nvarchar(10) PRIMARY KEY,
Module_Title nvarchar(MAX) NOT NULL
);

CREATE TABLE tblQuestions
(
Q_ID int PRIMARY KEY IDENTITY(1,1),
Question_Text varchar(1000) NOT NULL

);

CREATE TABLE tblFeedback
(
Submission_ID int PRIMARY KEY IDENTITY(1,1),
Username varchar(100) NOT NULL,
Domain varchar(50) NOT NULL,
DateTime_Submitted datetime NOT NULL
Module_ID nvarchar(10)
FOREIGN KEY (Module_ID) REFERENCES tblModules (Module_ID);
);

CREATE TABLE tblAnswers
(
Q_ID int NOT NULL,
Submission_ID int NOT NULL,
Answer_Text varchar(max),
FOREIGN KEY (Q_ID) REFERENCES tblQuestions(Q_ID),
FOREIGN KEY (Submission_ID) REFERENCES tblFeedback(Submission_ID)
);

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

                // If they have selected view all questions, get all answers for module
                if (ddQuestions.SelectedItem.Value == "all")
                {
                    //selectQuery = "SELECT * FROM tblAnswers ORDER BY Submission_ID";
                    selective = false;
                    //gridviewFeedback.Columns[3].Visible = true;

                    selectQuery = "SELECT * FROM tblAnswers A ";
                    selectQuery += "WHERE EXISTS (SELECT * FROM tblModules M JOIN tblFeedback F ON M.Module_ID = F.Module_ID ";
                    selectQuery += "WHERE F.Module_ID = '" + this.selectedModuleID + "')";


                }
                // Instead, if they have selected a specific question, get the information for the selected module and question
                else
                {
                    selectQuery = "SELECT * FROM tblAnswers WHERE Q_ID = '" + qID + "' ORDER BY Submission_ID";
                    selective = true;
                    //gridviewFeedback.Columns[3].Visible = false;
                }


                DataSet objDs = new DataSet();
                SqlDataAdapter myCommand2;
                myCommand2 = new SqlDataAdapter(selectQuery, myConnection);

                myCommand2.SelectCommand.CommandType = CommandType.Text;
                myCommand2.Fill(objDs);

                gridviewFeedback.DataSource = objDs;
                gridviewFeedback.DataBind();

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

ОБНОВЛЕНИЕ Просто понял, что мое другое утверждение тоже не работает - оно также не дает конкретных ответов для модуля.

Ответы [ 2 ]

2 голосов
/ 29 августа 2010

Вы, похоже, не коррелировали таблицу A в таблицу M или таблицу F. Это даст вам все строки в таблице A, если есть какие-либо модули или отзывы в любом месте с предоставленным идентификатором модуля. Вам необходимо добавить оператор AND, чтобы сопоставить таблицу A с тем, что содержится в предложении EXISTS.

selectQuery = @"
    SELECT * FROM tblAnswers A 
    WHERE EXISTS (
            SELECT * FROM tblModules M 
            JOIN tblFeedback F ON M.Module_ID = F.Module_ID 
            WHERE F.Module_ID = @ModuleID
            AND   A.Submission_ID = F.Submission_ID)";

Также рассмотрите , используя параметризованные запросы вместо добавления переменных в ваши строки. Это заставляет SQL Server более эффективно использовать кэш планов, что быстрее, а также исключает возможность атаки SQL-инъекцией.

1 голос
/ 29 августа 2010

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

SELECT ans.* FROM tblAnswers ans, tblFeedback fb
WHERE ans.Submission_ID = fb.Submission_ID
AND fb.Module_ID = 'selected module'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...