过程中的迭代表值调用以过滤行

时间:2018-12-02 03:53:26

标签: c# sql sql-server tsql stored-procedures

我正在使用asp.net mvc创建一个应用程序,并使用原始sql类连接到sql服务器。

我想做的是过滤我的班级索引或通过各种过滤器列出来。即部门的班级,讲师,时间,所有这些都堆叠在一起,以便我可以得到一张最终表,其中包含过滤结果,可用于填充列表以返回视图。

我的想法是在存储过程中使用表变量。第一次传递所有类的表,然后通过第一个过滤器进行过滤,然后传递该结果以应用下一个过滤器等。

这是我的课程表:

CREATE TABLE Project.Class 
(
    ClassId INT NOT NULL IDENTITY(1, 1) PRIMARY KEY,
    InstructorId INT NOT NULL FOREIGN KEY REFERENCES Project.Instructor(InstructorId),
    LocationId INT NOT NULL FOREIGN KEY REFERENCES Project.[Location](LocationId),
    TimeId INT NOT NULL FOREIGN KEY REFERENCES Project.[Time](TimeId),
    TermId INT NOT NULL FOREIGN KEY REFERENCES Project.Term(TermId),
    ClassTypeId INT NOT NULL FOREIGN KEY REFERENCES Project.ClassType(ClassTypeId),
    ClassName NVARCHAR(256) NOT NULL,


    UNIQUE(InstructorId, LocationId, TimeId)
);

我创建了一个像这样的表类型:

CREATE TYPE [Project].[ClassTableType] AS 
            TABLE(ClassId INT,
                  InstructorId INT,
                  LocationId INT,
                  TimeId INT,
                  TermId INT,
                  ClassTypeId INT,
                  ClassName NVARCHAR(256))
GO

这是部门过滤的一个示例:

CREATE PROCEDURE [Project].[FilterDepartment] @ClassTable Project.ClassTableType READONLY, @Department NVARCHAR(30)
AS
SELECT * FROM
@ClassTable CT
WHERE CT.ClassName = @Department
RETURN

这是我在c#中创建的用于调用以下过程的函数:

 public List<Class> GetFilteredClasses(string firstName, string lastName, string department, string days, string time, string term)
    {
        Connection();
        List<Class> classlist = new List<Class>();

        SqlCommand cmd = new SqlCommand("Project.GetAllClasses", con)
        {
            CommandType = CommandType.StoredProcedure
        };
        SqlDataAdapter sd = new SqlDataAdapter(cmd);
        DataTable dt = new DataTable();

        con.Open();
        sd.Fill(dt);

        if (department != "")
        {
            SqlCommand filterDepart = new SqlCommand("Project.FilterDepartment", con)
            {
                CommandType = CommandType.StoredProcedure
            };

            filterDepart.Parameters.AddWithValue("@ClassTable", dt);
            filterDepart.Parameters.AddWithValue("@Department", department);
            SqlDataAdapter departSd = new SqlDataAdapter(filterDepart);
            dt.Clear();

            departSd.Fill(dt);
        }
        if(firstName != "")
        {
            SqlCommand filterDepart = new SqlCommand("Project.FilterDepartment", con)
            {
                CommandType = CommandType.StoredProcedure
            };
            filterDepart.Parameters.AddWithValue("@FirstName", firstName);
            SqlDataAdapter departSd = new SqlDataAdapter(filterDepart);

            departSd.Fill(dt);
        }
        con.Close();
        foreach (DataRow dr in dt.Rows)
        {
            classlist.Add(
                new Class
                {
                    ClassId = Convert.ToInt32(dr["ClassId"]),
                    InstructorId = Convert.ToInt32(dr["InstructorId"]),
                    LocationId = Convert.ToInt32(dr["LocationId"]),
                    TimeId = Convert.ToInt32(dr["TimeId"]),
                    TermId = Convert.ToInt32(dr["TermId"]),
                    ClassTypeId = Convert.ToInt32(dr["ClassTypeId"]),
                    ClassName = Convert.ToString(dr["ClassName"])
                });
        }
        return classlist;
    }

现在,我只是使用Department!= null运行此函数,以便可以测试一个过滤器,但是当执行部门过滤器时,我的存储过程似乎为dt返回0行。我试图在SSMS中运行此过程并获得相同的结果。

在执行过程中我在做错什么,或者需要什么来继续过滤结果集?谢谢您的所有帮助。

0 个答案:

没有答案