我正在使用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中运行此过程并获得相同的结果。
在执行过程中我在做错什么,或者需要什么来继续过滤结果集?谢谢您的所有帮助。