【问题标题】:"Cannot find Table[0]" - Only in production?“找不到表 [0]” - 仅在生产中?
【发布时间】:2014-10-27 19:48:10
【问题描述】:

我们生产服务器上的一些代码突然给我们带来了一些麻烦。大约一年来生产没有改变,我已经确认数据库也没有改变。

如果我在我的机器上运行相同的代码(Yay Source Control!),我不会收到生产中出现的错误,并且一切正常。我将在下面发布代码,但肯定有其他事情发生。

如果我错了,请纠正我,但如果没有 Table[0],这意味着我的查询没有返回任何数据。然而,直接通过 SQL Management Studio 运行相同的查询可以得到我想要的数据。

    var ds = GetData(queryString);
    if (ds.Tables.Count > 0)
    {
        var ddlDataSet = GetAdds();
    }
    private List<tAdd> GetAdds()
    {
        var ds = GetData(queryString);
        var aList = new tAdd[ds.Tables[0].Rows.Count];//THIS IS WHERE ERROR HITS
        //Do other stuff
        ...
    }

    private DataSet GetData(string queryString)
    {
        var connectionString =
              ConfigurationManager.ConnectionStrings["constring"].ConnectionString;

        var ds = new DataSet();

        try
        {
            var connection = new SqlConnection(connectionString);
            var adapter = new SqlDataAdapter(queryString, connection);

            adapter.Fill(ds);
        }
        catch (Exception ex)
        {
            ErrorPanel.Visible = true;
            ErrorPanel.Enabled = true;
            SearchPanel.Enabled = false;

            const string NotificationsEmail = "mailto:emailguy@email.com";
            ErrorAlertLabel.Text =
                "An err happened. " +
                "Please contact the people who do stuff ";
            ErrorAlertLabel.Visible = true;
            ErrorMessageLiteral.Text = "<br />" + "<br />" +
                                       "Message: " + ex.Message + "<br />" +
                                       "StackTrace: " + ex.StackTrace + "<br />" +
                                       "Inner Exception: " + ex.InnerException + "<br />" +
                                       "Full Detals: " + ex + "<br />";
            ErrorMessageLiteral.Visible = true;
        }

        return ds;
     }

我可能会尝试再次重新发布相同的版本,但谁知道这是否会解决它。如果有人需要更多信息,请让我知道并提前感谢您。

实际错误文本:“System.IndexOutOfRangeException:找不到表 0。”

【问题讨论】:

  • 连接字符串有变化吗?与该用户相关的数据库中的权限?如果使用 Windows 身份验证,是否更改了运行 AppPool 的用户?
  • 连接字符串没有改变,权限也没有改变。我已经与 DBA 确认了这一点,并且在我的 PC 上运行代码时使用了相同的连接字符串(有效)。谢谢!
  • 实际错误是什么? “找不到表 [0]”听起来不像 .NET 异常。
  • 在 GetData 的//Do Error stuff 中,您是否重新抛出异常?你在那里有什么实际的“做事”?
  • 我感觉你需要的线索将在 //Do error stuff 中,特别是被捕获的 Exception 中的 InnerException

标签: c# sql asp.net .net


【解决方案1】:

我认为您在错误处理中仍然存在暴露的缺陷。

GetData 中,您可以捕获任何出现的Exception,并将一堆UI 元素设置为可见并用信息填充它们,但您不要阻止进程继续进行GetDatacatch 块之后继续,并返回一个空的DataSetGetAdds 忽略了发生错误的事实,尝试访问 DataSet 中不存在的表,并抛出 another 异常,该异常不是由您的代码处理,而是而是由 ASP.NET 处理,它会丢弃所有错误信息,只显示一个通用错误页面。

我不会在低级方法中使用如此详细的错误处理,而是添加更多的全局错误处理。由于您没有向异常添加任何有意义的信息,我只会让它冒泡并在应用程序级别处理它。

如果您想为低级异常添加更多信息,请抛出具有更多详细信息的 new 异常,并将原始异常分配给新异常的 InnerException 属性。

【讨论】:

    【解决方案2】:

    请检查您在生产中是否有任何 pdb 文件,如果没有,请转到您的项目右键单击 Build -> Advanced -> debug info -> pdb build this 下的属性,然后在生产环境中运行它,

    如果你有这些,你就可以得到准确的断线。

    这可能会发生,如果生产中的表存在死锁。或者权限缺失。

    【讨论】:

    • 我没有发布权限,因此该过程至少需要一天时间 :(。但是,生产、测试​​和我的机器都指向同一个数据库。我的应用程序只读取特定的数据库,因此我们不需要数据库的测试、开发或 QA 版本。其他地方一切正常。
    • 你做了什么改变......当你遗漏了一些相关的代码,尤其是你提到的关于数组[]的部分时,真的很难确定任何事情
    • 未进行任何更改。这段代码已经运行了一年。
    • ok 任何环境更改,例如将项目从 .net 2.0 编译到 3.5 / 4.0 或 4.5 你能对项目进行清理并重新构建所有...?
    • 生产中的数据库,有时会出现一些内存问题,这可能会导致所有这些问题,如果有一个 DBA 检查所有死锁并在发生时清除它们总是更好
    【解决方案3】:

    今天搞定了。我终于找到了我们的网络管理员,并要求他重新启动网络服务器——这是在我确认我的代码和数据库不是问题之后。

    Web 服务器启动后,一切正常。服务器上运行着很多应用程序,所以可能是有些东西在纠结。

    【讨论】:

      猜你喜欢
      • 2017-05-25
      • 2017-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多