【问题标题】:C# using a while loop for SqlDataReader [closed]C#对SqlDataReader使用while循环[关闭]
【发布时间】:2019-02-10 18:16:05
【问题描述】:

我正在尝试使用 while 循环修改来自数据读取器的数据,以使用 innerHtml 将数据显示为网页上 HTML 表中的行。它适用于第一次迭代,但不会对其余数据再次迭代。

已检查数据读取器上是否存在所有数据,因此似乎与我的 while 循环代码有关

关于我做错了什么有什么建议吗?

string description = "placeholder";
string desc_mod;

query.InnerHtml += "<table class='list_format'>";

using (SqlDataReader productList = SQLHelper.ExecuteQuery(query1))
    if (productList.HasRows)
    {
        while (productList.Read())
            description = (string)productList["Description"];

        desc_mod = description.Substring(0, 30);
        query.InnerHtml += "<tr><td><div><p>" + desc_mod + "</p</div></td></tr>";
    }

query.InnerHtml += "</table>";

【问题讨论】:

  • 所以在调试器中运行它,单步执行while循环,看看发生了什么。 productList.Read() 会不会意外返回 false? (您可能需要添加一个变量来检查这一点,因为对Read 的重复调用会改变状态)。 InnerHtml 在每次循环中会发生什么,等等。
  • 把你的身体戴上大括号,看看有没有帮助?
  • 如果这是您的实际代码,那么您的 while 循环仅执行 description = (string)productList["Description"]; 行。在 {} 中包装循环相关代码
  • 正如你们所提到的那样,缺少大括号才是问题所在。谢谢!!

标签: c# sql-server while-loop sqldatareader


【解决方案1】:

你缺少一组花括号来分隔你的 while 块和你的 using 块:

    string description = "placeholder";
    string desc_mod;
    query.InnerHtml += "<table class='list_format'>";
    using (SqlDataReader productList = SQLHelper.ExecuteQuery(query1)) {
        if (productList.HasRows){
            {
                while (productList.Read()) {
                    description = (string)productList["Description"];
                    desc_mod = description.Substring(0, 30);
                    query.InnerHtml += "<tr><td><div><p>" + desc_mod + "</p</div></td></tr>";
                }
            }
        }
    }
    query.InnerHtml += "</table>";

如果您省略代码块上的大括号,例如 usingwhileif 等,编译器只会将紧随其后的行视为代码块的一部分。

【讨论】:

  • 我要在评论后说只有“description = (string)productList["Description"];"如果您不使用大括号,将属于您的 WHILE 循环。
  • 这使它成为一个错字问题,这意味着它应该被关闭,而不是回答。
  • @TimSchmelter - 是的,但他们也没有调试过这个(这是我对这个问题的评论建议他们做的)。如果他们这样做了,他们会看到只有description = 行被重复调用,此时这可能使它成为一个有点好的问题,但因为它也没有得到充分研究。
  • @Damien_The_Unbeliever,如果不使用大括号 {},解释也只是一半。如果您不使用大括号,那么首先只有 while 条件将执行到最后一条记录,然后下一行将开始执行。这意味着描述变量将只包含最后一个值,并且将创建一个且只有一个行 标记。
【解决方案2】:

while 语句缺少一些括号

string description = "placeholder";
    string desc_mod;
    query.InnerHtml += "<table class='list_format'>";
    using (SqlDataReader productList = SQLHelper.ExecuteQuery(query1))
        if (productList.HasRows){
            {
                while (productList.Read())
                {
                    description = (string)productList["Description"];
                    desc_mod = description.Substring(0, 30);
                query.InnerHtml += "<tr><td><div><p>" + desc_mod + "</p</div></td></tr>";
                }
            }
        }
    query.InnerHtml += "</table>";

【讨论】:

  • 这使它成为一个错字问题,这意味着它应该被关闭,而不是回答。
  • 我没有看到因拼写错误而关闭的标志,但我同意这对其他人来说不是有用的参考
  • @RichardHubley: Close -> Off Topic -> “这个问题是由无法再复制的问题或简单的印刷错误...”(倒数第二个)引起的选项)
  • @RichardHubley 这对其他人有用。许多其他人可以吸取“永远不要省略大括号”的教训,同样的问题导致了例如 Apple SSL 错误,它产生了巨大的后果......因为一个错字。
【解决方案3】:

使用foreach 循环和DbDataRecord

string description = "placeholder";
string desc_mod;
query.InnerHtml += "<table class='list_format'>";   

using (var r = SQLHelper.ExecuteQuery(query1))
{
    foreach (DbDataRecord s in r)
    {
        description = (string)s["Description"];
        desc_mod = description.Substring(0, 30);
        query.InnerHtml += "<tr><td><div><p>" + desc_mod + "</p</div></td></tr>";
    }
}

query.InnerHtml += "</table>";

【讨论】:

    猜你喜欢
    • 2013-08-08
    • 2017-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-18
    • 2016-10-12
    • 1970-01-01
    • 2020-07-27
    相关资源
    最近更新 更多