我的aspx页面中有一个Repeater控件:
<asp:Repeater ID="repeater" runat="server" EnableViewState="false">
<ItemTemplate>
<%# Eval("someAttribute") %>
</ItemTemplate>
</asp:Repeater>
在Page_Load上我有以下代码:
if (String.IsNullOrEmpty((string)Request.QueryString["action"]))
s.OpenConn("SELECT * FROM someTable;");
else
s.OpenConn("SELECT * FROM someTable WHERE id=1;");
if (s.Read())
{
repeater.DataSource = s.GetRead();
repeater.DataBind();
}
问题是,当我输入?action = something时,页面上不会显示数据。 但如果我删除?action = something,我会得到所有数据。
我做错了吗?
答案 0 :(得分:5)
看起来像您的查询
s.OpenConn("SELECT * FROM someTable WHERE id=1;");
没有返回任何东西。或者,您的#Eval语句返回一个空字符串。将其更改为
<ItemTemplate>
<%#Eval("SomeAttribute")%> I found one!
</ItemTemplate>
如果转发器的.DataSource属性不是空列表,请确保获得一些输出。这样,“我找到了一个!”即使“SomeAttribute”为空,也会显示。
提示:
从来没有,EVER EVER直接在.ASPX.cs中嵌入查询。使用过的存储过程或(叹气)参数化查询。
此外,不要在代码隐藏页面中进行任何数据库交互。将您的数据访问重构为一个单独的类。你以后会谢谢我。 Google可以进行n层架构,单元测试或关注点分离,以进行更详细的分析。
您不需要将.QueryString []值转换为字符串。它们已经是字符串了。
在
上设置断点if(s.Read())
看看你到达那里会发生什么。这将帮助您找到问题。
答案 1 :(得分:2)
除非s
引用的对象做了一些非常奇怪的事情,我能想到的唯一原因是someTable
没有id = 1
的行。您是否尝试直接在Sql Server Management Studio中执行第二个SQL语句?
答案 2 :(得分:2)
您已经在if语句中阅读并跳过了第一个结果。删除它:
if (s.Read())