【问题标题】:System.IndexOutOfRangeException: There is no row at position 80 Error comes when sending emailsSystem.IndexOutOfRangeException:位置 80 处没有行 发送电子邮件时出现错误
【发布时间】:2017-12-23 22:15:45
【问题描述】:

我正在开发一个简单的警报系统。 SQL 表中有警报(由 INNER JOIN 收集)与要发送的 用户电子邮件 地址和其他一些信息。我想要做的是,阅读表格并将警报消息发送到相关的电子邮件地址。 我为此开发了一个应用程序,带有一个 for 循环。但是在过程结束时会发生异常。 表中有 80 行(80 行是动态的。它可以随时更改)。 For 循环从索引中的 0 开始,它检索表中的第一项并继续执行,中间没有任何错误。但是,在发送第 80 个警报(最后一个警报)后,它显示异常为

"System.IndexOutOfRangeException: 位置 80 处没有行" 。

我不知道如何解决这个问题。我尝试了很多方法,但无法解决这个问题。有没有人可以帮助我解决这个问题?

   Common ComMsg = new Common();//Common is a name of a class
   DataSet DatMsg = new DataSet();
   private void btnSend_Click(object sender, EventArgs e)
    {
        try
        {
            DatMsg = ComMsg.ReturnDataSet("SELECT RptAlertRecipient.Name,  RptAlertRecipient.Email,  RptAlerts.Factory,  RptAlerts.AlertTime,  RptAlerts.Description " +
                                      "FROM RptAlerts " +
                                      "INNER JOIN RptAlertTypes ON  RptAlerts.AlertTypeID = RptAlertTypes.ID " +
                                      "INNER JOIN RptAlertType_RecipientMapping ON  RptAlertTypes.ID = RptAlertType_RecipientMapping.AlertTypeID " +
                                      "INNER JOIN RptAlertRecipient ON  RptAlertType_RecipientMapping.AlertRecipientID = RptAlertRecipient.ID " +
                                      "ORDER BY RptAlertRecipient.Name ASC");

            for (int i = 0; i < DatMsg.Tables[0].Rows.Count; i++)
            {
                if (DatMsg.Tables[0].Rows.Count > 0)
                {
                    string to = DatMsg.Tables[0].Rows[i].ItemArray.GetValue(1).ToString();
                    string from = "from_mail_address@mydomain.com";
                    string subject = "Alert In Time";
                    string msgBody = "Dear " + DatMsg.Tables[0].Rows[i].ItemArray.GetValue(0).ToString() + "," + "<br/>" + "<br/>" + DatMsg.Tables[0].Rows[i].ItemArray.GetValue(4).ToString() + "<br/>" + "<br/>" + "Regards" + "<br/>" + "Sent by Alert Service";
                    MailMessage msg = new MailMessage(from, to, subject, msgBody);
                    msg.IsBodyHtml = true;
                    SmtpClient clnt = new SmtpClient("mail.smtpserveraddress.local", 25);
                    clnt.EnableSsl = false;
                    clnt.Credentials = new System.Net.NetworkCredential("from_mail_address@mydomain.com", "password");
                    clnt.Send(msg);
                }  
            }
        }
        catch (Exception ex)
        {
            Message.Show("Error: "+ex.Message);
        }
    }

【问题讨论】:

  • 您使用的任何列都可以为空吗?
  • 没有。所有的列都填充了一些信息。
  • 哪一行抛出行索引超出范围错误? for 循环似乎是正确的,但循环内部的某个地方出错了。

标签: c# sql-server email exception


【解决方案1】:

问题在于您的 for 循环。应该是这样的:

for (int i = 0; i < DatMsg.Tables[0].Rows.Count - 1; i++)
{
    ....
}

由于索引从 0 开始,第 80 项将位于位置 79

【讨论】:

  • 原文是正确的。您的版本将在索引 78 结束
  • 如果起始索引为 0,那么第 80 项怎么会是 78?它在 79 日
  • 是的,但是在你的 for 循环中,i 的范围是 0-78
  • 不,有 80 行所以 DatMsg.Tables[0].Rows.Count = 80 所以 DatMsg.Tables[0].Rows.Count - 1 = 79 这就是为什么循环将从 0 开始运行到 79 = 80 个元素
  • 看看情况...i &lt; DatMsg... - 它说小于 - 意味着它不会达到 79
猜你喜欢
  • 2021-06-19
  • 2013-11-24
  • 1970-01-01
  • 2014-06-07
  • 2015-02-15
  • 1970-01-01
  • 1970-01-01
  • 2014-01-14
  • 2012-08-23
相关资源
最近更新 更多