Повторитель ASP.NET WebForms не отображает все записи

Я работаю над устаревшим сайтом веб-форм ASP.NET 2.0. По какой-то причине элемент управления DataReader не получает все записи, извлекаемые SQL-запросом. Я запускаю запрос в SQL Management Studio, и возвращаются 3 записи. Я получаю только 2 записи, когда вручную перебираю DataReader, и только 2 записи отображаются, когда я привязываю данные к повторителю.

Код VB.NET:

sql = "SELECT tblImages.ImageID, tblProducts.ProductName FROM tblImages INNER JOIN tblProducts ON tblImages.ProductID = tblProducts.ProductID WHERE tblImages.ProductID = 725 ORDER BY tblImages.Main DESC, tblImages.ImageID ASC"
comm = New SqlCommand(sql, conn)
dr = comm.ExecuteReader()
If dr.Read() = True Then        
    rptGallery.DataSource = dr
    rptGallery.DataBind()
End If
dr.Close()
conn.Close()

Разметка повторителя:

<asp:Repeater ID="rptGallery" runat="server">
<HeaderTemplate>
    <div id="slider" class="flexslider">
        <ul class="slides">
</HeaderTemplate>
<ItemTemplate>
    <li>
      <a href="getimage.aspx?id=<%# Eval("ImageID")%>&format=large" data-featherlight="image">
      <img src="getimage.aspx?id=<%# Eval("ImageID")%>&format=medium" alt="<%# Eval("ProductName")%>" /></a>
    </li>
</ItemTemplate>
<FooterTemplate>
      </ul>
    </div>
</FooterTemplate>
</asp:Repeater>

Когда я выполняю ручную итерацию, как в приведенном ниже коде, я могу проверить переменную ic, и ее значение после итерации по записям в устройстве чтения данных равно 2, хотя должно быть 3.

If dr.Read() = True Then
    Dim ic As Integer = 0
    While dr.Read()
        ic = ic + 1
    End While
End If

person David    schedule 25.02.2015    source источник
comment
ах, так что оператор if dr.Reader() = true перемещает курсор на единицу, поэтому первая запись пропускается, а в то время как dr.Read() начинается с записи 2 вместо 1. Спасибо!   -  person David    schedule 25.02.2015


Ответы (1)


Каждый вызов dr.Read() перемещает курсор. Итак, вы пропускаете запись. Возможно, вместо чтения записей следует использовать ссылку Таблица данных? Просто используйте функцию Load() для считывания информации с устройства чтения данных, а затем привяжите ее к ретранслятору.

Кроме того, вам нужно обернуть SqlConnection в оператор using, чтобы убедиться, что он правильно утилизируется.

В С# это будет так:

sql = "SELECT tblImages.ImageID, tblProducts.ProductName FROM tblImages INNER JOIN tblProducts ON tblImages.ProductID = tblProducts.ProductID WHERE tblImages.ProductID = 725 ORDER BY tblImages.Main DESC, tblImages.ImageID ASC";
DataTable dt = new DataTable();
using (SqlConnection conn = new SqlConnection("connectionstring"))
{      
    comm = new SqlCommand(sql, conn);       
    conn.Open();
    dt.Load(comm.ExecuteReader());        
}
rptGallery.DataSource = dt;
rptGallery.DataBind();

В VB.NET это было бы так (используется автоматический преобразователь кода, поскольку я не кодер VB)

sql = "SELECT tblImages.ImageID, tblProducts.ProductName FROM tblImages INNER JOIN tblProducts ON tblImages.ProductID = tblProducts.ProductID WHERE tblImages.ProductID = 725 ORDER BY tblImages.Main DESC, tblImages.ImageID ASC"
Dim dt As New DataTable()
Using conn As New SqlConnection("connectionstring")
    comm = New SqlCommand(sql, conn)        
    conn.Open()
    dt.Load(comm.ExecuteReader())       
End Using
rptGallery.DataSource = dt
rptGallery.DataBind()
person mason    schedule 25.02.2015