尝试根据下拉列表中的选择过滤数据网格

时间:2010-08-29 16:45:09

标签: c# sql sql-server gridview

我有一个包含两个下拉列表的“查看反馈”页面,用于过滤问题答案的网格视图。第一个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不是很有经验,并且编辑了我在其他地方使用过的其他人给我的声明。

UPDATE 刚刚意识到我的另一个声明也没有用 - 它也没有提供模块特定的答案。

2 个答案:

答案 0 :(得分:2)

您似乎没有将表A与表M或表F相关联。如果有任何模块或反馈,则会在表A中为所有行提供所提供的模块ID。您需要添加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 :(得分:1)

请尝试此查询。我认为应该这样做。 这应该可以帮助您获得属于特定模块的所有答案

SELECT ans.* FROM tblAnswers ans, tblFeedback fb
WHERE ans.Submission_ID = fb.Submission_ID
AND fb.Module_ID = 'selected module'