2013-05-13 78 views
1

我创建了一个SQL Server存储过程,我在其中使用游标并创建了一个ASP.NET方法来执行该过程。我正在使用SqlDataReaderwhile(reader.Read())来读取值。问题是存储过程中的游标返回很多行,但该方法只读取第一条记录。任何人都可以帮忙存储过程返回很多记录,但数据读取器只能看到一个记录

存储过程:

create procedure [dbo].[GetMenusUserGroupCanView] 
(
    @UserGroupID int 
,@LanguageID int 
) as begin 

    declare @MenuID int 

    declare @Title varchar(255) 

    declare db_cursor cursor for 
    (
     select MenuID 
     from TrioGate.dbo.Sys_UserGroupMenus 
     where [email protected] and ViewFlag='true' 
    ) 

    open db_cursor 

    fetch next from db_cursor into @MenuID 

    while @@fetch_status = 0 begin 

     select 
     Sys_Menus.MenuID 
     ,Sys_Menus.ParentMenuID 
     ,Sys_Menus.DescriptionLabelID 
     ,Sys_Menus.TitleLabelID 
     ,Sys_Menus.TooltipLabelID 
     ,Sys_Menus.[Icon] 
     ,Sys_Menus.[MenuName] 
     ,Sys_Menus.[MenuTypeID] as MenuType 
     ,[dbo].[Get_ParentMenu_Name](Sys_Menus.ParentMenuID) as ParentMenuName 
     ,[dbo].[Get_Label_Description](Sys_Menus.TitleLabelID,1) as Title 
     ,[dbo].[Get_Label_Description](Sys_Menus.TooltipLabelID,1) as Tooltip 
     ,[dbo].[Get_Label_Description](Sys_Menus.DescriptionLabelID,1) as [Description] 
     ,Sys_Menus.[MainTableName] as [Table] 
     ,Sys_Menus.[Seq],Sys_Menus.[MenuPath],Sys_Menus.ActivateLog,Sys_Menus.MenuID 
     from Sys_Menus 
      left join Sys_LabelDetails 
      on Sys_Menus[TitleLabelID] = Sys_LabelDetails[LabelID] 
     where Sys_LabelDetails.LanguageID = @LanguageID 
     and MenuID = @MenuID  

     fetch next from db_cursor into @MenuID 

    end 

    close db_cursor 
    deallocate db_cursor 

end 

方法:

public List<Menu> GetMenusUserGroupCanView(int UserGroupID, int LanguageID) 
{ 
    List<Menu> list = new List<Menu>(); 
    SqlCommand cmd = new SqlCommand("GetMenusUserGroupCanView ", Connection); 
    cmd.CommandType = CommandType.StoredProcedure; 
    cmd.Parameters.AddWithValue("@UserGroupID", UserGroupID); 
    cmd.Parameters.AddWithValue("@LanguageID", LanguageID); 
    try 
    { 

     Connection.Open(); 
     SqlDataReader reader = cmd.ExecuteReader(); 
     while (reader.Read()) 
     { 
      Menu entry = new Menu(); 
      entry.MenuID = (int)reader["MenuID"]; 
      entry.ParentMenuID = (int)reader["ParentMenuID"]; 
      entry.ActivateLog = (bool)reader["ActivateLog"]; 
      entry.Description = reader["Description"].ToString(); 
      entry.DescriptionLabelID = (int)reader["DescriptionLabelID"]; 
      entry.Icon = (byte[])reader["Icon"]; 
      entry.MainTableName = reader["Table"].ToString(); 

      entry.MenuName = reader["MenuName"].ToString(); 
      entry.MenuPath = reader["MenuPath"].ToString(); 
      entry.MenuTypeID = reader["MenuType"].ToString(); 
      entry.ParentMenuName = reader["ParentMenuName"].ToString(); 
      entry.Seq = (int)reader["Seq"]; 

      entry.Title = reader["Title"].ToString(); 
      entry.TitleLabelID = (int)reader["TitleLabelID"]; 
      entry.Tooltip = reader["Tooltip"].ToString(); 
      entry.ToolTipLabelID = (int)reader["ToolTipLabelID"]; 
      list.Add(entry); 
     } 

    } 
    catch { } 
    finally 
    { 
     Connection.Close(); 
    } 
    return list; 
}  
+1

请向我们展示您的SQL。 – 2013-05-13 18:07:10

+0

并向我们展示您的C#方法调用该存储过程并读取数据! – 2013-05-13 18:40:50

+0

嗯听起来像你正在使用编程对Oracle数据库。 – 2013-05-13 18:51:27

回答

5

你的循环的每次迭代进行选择。所以,而不是一套记录,你会得到多个

选择你的命运:

A.(治疗症状):提前结果集之间的读者IDataReader. NextResult()

B.(解决问题):有没有必要的光标; 使用连接代替

select 
* /* dump your columns back in here */ 
from Sys_UserGroupMenus as g 
    join Sys_Menus as m 
     join Sys_LabelDetails as d 
     on d.LabelID = m.TitleLabelID 
     and d.LanguageID = @LanguageID 
    on m.MenuID = g.MenuID 
where g.UserGroupID = @UserGroupID 
and g.ViewFlag = 'true' 
+1

感谢所有,谢谢你我真的使用了联接,它的工作,也试图用第一个解决方案与布尔标志=真; while(reader.Read()|| flag){.... flag = reader.NextResult();}它也起作用 – 2013-05-13 19:28:49

相关问题