2017-02-22 5 views
0

フォトギャラリーページを作成しようとしています。 このページには、多数のグループ(テニス、ゴルフなど)が表示されます。各グループには多数のフォトコレクションがあり、各コレクションには多数のイメージがあります。画像を表示しようとしたときに2つ以上の値を返すサブクエリ

ネストされたリピーターを使用して、グループ名を表示してから、写真コレクション名をクリックしてから画像を表示します。

コレクションに1つのイメージがある場合、私のコードは正常に動作します。しかし、コレクションに2番目のイメージを追加すると、以下のエラーが表示されます。

サブクエリが1つ以上の値を返しました。サブクエリは、次の時にこれが許可されていない=、!=、<、< =、>、> =またはサブクエリが式として使用されている場合

このクエリの目的はそれに接続されているすべての画像を取得することである

写真コレクション。

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

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

または結合を使用します。また、代わりに文字列の連結のパラメータ化ステートメントを使用し

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

+0

これはパラメータ化する必要があります。 –

+1

@SeanLange私は同意しますが、私はこれがコースワークだと推測しています。 – SqlZim

+1

そうかもしれません。私はちょうどそれが何かが救済されるので言及する必要があると言っています。他の人が答えを探して、自分のウェブサイトでこれを飛ばしているかもしれません。 –

1

INを使用してください。 exists()を使用して

select i.Id, 
    i.filename, 
    i.imageDesc 
from Group_Images i 
join Photo_Collection_Images c on i.ID = c.Group_Image_Id 
where c.Photo_Collection_Id = @Group_id 
関連する問題