尝试显示图像时,子查询返回的值超过1

时间:2017-02-22 16:34:02

标签: c# sql-server

我正在尝试创建照片库页面。 此页面将显示许多组(网球,高尔夫等)。每个组都可以拥有多个照片集,每个集合都可以有多个图像。

我正在使用嵌套转发器,首先显示组名,然后是照片集名称,然后是图像。

如果我在一个集合中有一个图像,我的代码工作正常。但是当我在集合中添加第二个图像时,我在下面发布的C#中出现了以下错误:

  

子查询返回的值超过1。子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时不允许这样做

此查询的目的是检索连接到该照片集的所有图像。

我需要进行哪些更改才能显示每个集合的所有图像,而不仅仅是一个?

 <div class="panel-heading">
                                <h4 class="panel-title"><%# Eval("Group_Name") %></h4>
                            </div>
                            <div class="panel-body">
                                <asp:Repeater ID="repPhotoAlbums" runat="server" OnItemDataBound="repPhotoAlbums_ItemDataBound">
                                    <ItemTemplate>
                                        <div class="col-lg-12">
                                            <h5><%# Eval("Name") %></h5>
                                            <asp:Repeater ID="repPhotos" runat="server">
                                                <ItemTemplate>
                                                    <a id="imageLink" href='<%# Eval("filename","../Images/{0}") %>' title='<%#Eval("imageDesc") %>' rel="lightbox[Brussels]">
                                                        <asp:Image ID="Image1" ImageUrl='<%# Bind("filename", "../Images/{0}") %>' runat="server" Width="112" Height="84" />
                                                    </a>
                                                </ItemTemplate>
                                            </asp:Repeater>
                                        </div>
                                        <!--col-lg-12-->
                                    </ItemTemplate>
                                </asp:Repeater>
                            </div>
                            <!--panel-body-->

C#:

   protected void repPhotoAlbums_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
     if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {
        Repeater repPhotos = (Repeater)(e.Item.FindControl("repPhotos"));


        string Group_Id = DataBinder.Eval(e.Item.DataItem, "p_Collection_Id").ToString();
        //Need to assign the Data in datatable
        SqlDataAdapter sda = new SqlDataAdapter("SELECT Id, filename, imageDesc FROM Group_Images WHERE ID = (Select g_Image_Id = Group_Image_Id FROM Photo_Collection_Images WHERE Photo_Collection_Id = '" + Group_Id + "');", con);
        DataTable dt = new DataTable();
        sda.Fill(dt);
        repPhotos.DataSource = dt;
        repPhotos.DataBind();
    }

}

另外,如果有帮助,我可以发布存储此数据的SQL表。 非常感谢能帮助我的人。

2 个答案:

答案 0 :(得分:2)

使用exists()

select 
   Id
 , filename
 , imageDesc
from Group_Images as g
where exists (
  select 1 
  from Photo_Collection_Images as i
  where g.Id = i.Group_Image_Id
    and i.Photo_Collection_Id = '" + Group_Id + "'
  )
  

注意:对于实际使用,此类代码需要使用参数来阻止sql injection

答案 1 :(得分:1)

使用reloadGrid。另外,使用参数化语句而不是字符串连接:

IN

或使用加入:

select Id,
    filename,
    imageDesc
from Group_Images
where ID in (
        select Group_Image_Id
        from Photo_Collection_Images
        where Photo_Collection_Id = @Group_id
        )