ASP.NET WebForms 转发器未显示所有记录
ASP.NET WebForms repeater not displaying all records
我正在处理遗留 ASP.NET 2.0 Web 表单站点。由于某种原因,DataReader 控件没有获取 SQL 查询提取的所有记录。我 运行 SQL Management Studio 中的查询返回了 3 条记录。当我手动遍历 DataReader 时我只得到 2 条记录,当我数据绑定到中继器时只显示 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
每次调用 dr.Read()
都会使光标前进。所以你正在跳过一个记录。也许您不应该读取记录,而应该使用 DataTable?只需使用 Load()
函数从您的数据 reader 中读取信息,然后将其绑定到您的转发器。
此外,您需要将 SqlConnection
包裹在 using statement 中,以确保它得到妥善处理。
在 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()
我正在处理遗留 ASP.NET 2.0 Web 表单站点。由于某种原因,DataReader 控件没有获取 SQL 查询提取的所有记录。我 运行 SQL Management Studio 中的查询返回了 3 条记录。当我手动遍历 DataReader 时我只得到 2 条记录,当我数据绑定到中继器时只显示 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
每次调用 dr.Read()
都会使光标前进。所以你正在跳过一个记录。也许您不应该读取记录,而应该使用 DataTable?只需使用 Load()
函数从您的数据 reader 中读取信息,然后将其绑定到您的转发器。
此外,您需要将 SqlConnection
包裹在 using statement 中,以确保它得到妥善处理。
在 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()