C# SQL查询-如何使用gridview的XML路径查询显示单行
我从ModuleStaff、Staff和Roles中检索了3个表。我打算做的是在gridview中的一行中显示数据。例如,负责第1组和第2组的staffadrian将显示为:C# SQL查询-如何使用gridview的XML路径查询显示单行,c#,asp.net,sql,visual-studio-2010,for-xml-path,C#,Asp.net,Sql,Visual Studio 2010,For Xml Path,我从ModuleStaff、Staff和Roles中检索了3个表。我打算做的是在gridview中的一行中显示数据。例如,负责第1组和第2组的staffadrian将显示为: StaffName | RoleName | GroupNumber Adrian | Lecturer | 1,2 现在,我遇到了同一个staffadrian但角色名不同的问题,组号1和2,即使导师和领导的数据库数据为空 我现在得到的是: StaffName | RoleName | GroupNu
StaffName | RoleName | GroupNumber
Adrian | Lecturer | 1,2
现在,我遇到了同一个staffadrian但角色名不同的问题,组号1和2,即使导师和领导的数据库数据为空
我现在得到的是:
StaffName | RoleName | GroupNumber
Adrian | Lecturer | 1,2
Adrian | Tutor | 1,2
Adrian | Leader | 1,2
它应该是什么:
StaffName | RoleName | GroupNumber
Adrian | Lecturer | 1,2
Adrian | Tutor |
Adrian | Leader |
这是我的密码:
public DataTable DisplayModuleStaffGroup(string year, string module, string diploma)
{
try
{
using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["MARSConnectionString"].ConnectionString))
{
using (SqlCommand cmd = con.CreateCommand())
{
cmd.CommandText = "SELECT ms.ModuleCode, ms.ModuleYear, ms.DiplomaID, sr.RoleName, s.StaffName, s.StaffStatus, GroupNumber = ";
cmd.CommandText += " substring((SELECT ( ', ' + GroupNumber ) FROM ModuleStaff ms2, Staff s2 ";
cmd.CommandText += " WHERE ms.StaffID = ms2.StaffID AND ms2.StaffID = s2.StaffID ";
cmd.CommandText += " ORDER BY s2.StaffName, ms2.GroupNumber ";
cmd.CommandText += " FOR XML PATH( '' )), 3, 1000) ";
cmd.CommandText += " FROM ModuleStaff ms ";
cmd.CommandText += " INNER JOIN StaffRoles sr ON ms.RoleID = sr.RoleID ";
cmd.CommandText += " INNER JOIN Diploma d ON ms.DiplomaID = d.DiplomaID ";
cmd.CommandText += " INNER JOIN Staff s ON ms.StaffID = s.StaffID ";
cmd.CommandText += " WHERE (ms.DiplomaID = @dip) AND (ms.ModuleYear = @year) AND (ms.ModuleCode = @code) ";
cmd.CommandText += " ORDER BY ms.RoleID DESC ";
cmd.Parameters.AddWithValue("@dip", diploma);
cmd.Parameters.AddWithValue("@year", year);
cmd.Parameters.AddWithValue("@code", module);
DataSet dSet = new DataSet();
using (SqlDataAdapter da = new SqlDataAdapter(cmd))
{
da.Fill(dSet, "DisplayModuleStaffGroup");
return dSet.Tables["DisplayModuleStaffGroup"];
}
}
}
}
catch
{
throw;
}
finally
{
}
}
我不太确定应该如何查询XML Path/sql语句,以便根据rolename和staffname提供组号。有人能帮我吗?谢谢。您可以在sql中遍历循环。。 以下是你可以应用的想法
declare @totalStaff int
declare @totalRoles int
declare @staffCount int
declare @roleCount int
declare @staffId int
declare @staffName varchar(max)
declare @roleId int
declare @roleName varchar(max)
declare @groupCount int
declare @table table(staffName varchar(max),roleName varchar(max),roles varchar(max))
set @staffCount=1
set @roleCount=1
set @totalStaff=(select count(*) from staff)
while(@staffCount<=@totalStaff)
begin
set @staffId=select a.ID from
(select row_number() over(order by ID) as sr,ID from satff)a
where a.sr=@staffCount
set @staffName=(select staffName from staff where staffId=@staffId)
set @totalRoles=(select count(*) from roles where staffId=@staffId)
while(@roleCount<=@totalRoles)
begin
set @roleId=select a.ID from
(select row_number() over(order by ID) as sr,ID from roles)a
where a.sr=@roleCount
set @roleName=(select roleName from roles where roleId=@roleId)
--now same as above go through the loop for group
end
end
我建议您删除所有C代码,并关注SQL查询本身,因为我认为这更像是一个与SQL相关的问题,而不是一个C。在使用C调用之前,请先尝试在SQL Management Studio中使您的查询工作。嗨,steve,我已经让它们工作了,但我现在需要的是在SQL查询中添加一个独特的函数。我不确定对XML路径使用distinct函数的格式。有什么想法吗?我的意思是,您应该创建一个查询,该查询正好生成您想要的输出,包括子表的聚合。