怪异的转发器问题

时间:2010-03-17 20:03:51

标签: c# asp.net

我的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,我会得到所有数据。

我做错了吗?

3 个答案:

答案 0 :(得分:5)

看起来像您的查询

 s.OpenConn("SELECT * FROM someTable WHERE id=1;");

没有返回任何东西。或者,您的#Eval语句返回一个空字符串。将其更改为

<ItemTemplate>
    <%#Eval("SomeAttribute")%> I found one!
</ItemTemplate>

如果转发器的.DataSource属性不是空列表,请确保获得一些输出。这样,“我找到了一个!”即使“SomeAttribute”为空,也会显示。

提示:

  1. 从来没有,EVER EVER直接在.ASPX.cs中嵌入查询。使用过的存储过程或(叹气)参数化查询。

  2. 此外,不要在代码隐藏页面中进行任何数据库交互。将您的数据访问重构为一个单独的类。你以后会谢谢我。 Google可以进行n层架构,单元测试或关注点分离,以进行更详细的分析。

  3. 您不需要将.QueryString []值转换为字符串。它们已经是字符串了。

  4. 上设置断点

    if(s.Read())

  5. 看看你到达那里会发生什么。这将帮助您找到问题。

答案 1 :(得分:2)

除非s引用的对象做了一些非常奇怪的事情,我能想到的唯一原因是someTable没有id = 1的行。您是否尝试直接在Sql Server Management Studio中执行第二个SQL语句?

答案 2 :(得分:2)

您已经在if语句中阅读并跳过了第一个结果。删除它:

if (s.Read())