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

Я работаю над устаревшим сайтом ASP.NET 2.0 Web Forms. По какой-то причине элемент управления 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

1 ответ

Решение

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

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

В C# это было бы так:

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()
Другие вопросы по тегам