【问题标题】:Why are my SQL Connections not returning requested columns?为什么我的 SQL 连接没有返回请求的列?
【发布时间】:2015-12-01 20:41:14
【问题描述】:

我有一个 ASP.NET 网站(运行 v2.0)和一个 SQL Server 数据库(2012),当很多人点击该页面时,我遇到了一个奇怪的错误。错误是:

Column 'product_code' does not belong to table .  // occurs on line 'if (!row.IsNull("product_code") && !row.IsNull("state"))' below

这似乎表明线程之间正在进行某种连接共享,但我似乎无法弄清楚原因。在我后面的代码中:

private Dictionary<string, string> _saleStates = null;
protected Dictionary<string, string> SalesStates {
    get {
        if (_saleStates == null)
        {
            _saleStates = new Dictionary<string, string>();
            string sql = @"SELECT [product_code], [state] FROM [jsb_store_items]";
            using (DataTable tbl = new DataTable())
            {
                using (SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["Shop.DbConnection"].ConnectionString))
                {
                    using (SqlCommand cmd = new SqlCommand(sql, conn))
                    {
                        using (SqlDataAdapter adapter = new SqlDataAdapter(cmd))
                        { adapter.Fill(tbl); }
                    }
                }
                if (tbl.Rows.Count > 0)
                {
                    foreach (DataRow row in tbl.Rows)
                    {
                        if (!row.IsNull("product_code") && !row.IsNull("state")) // Error thrown here
                        { _saleStates.Add(row["product_code"].ToString().ToLower(), salesStateToText(row["state"].ToString().ToLower())); }
                    }
                }
            }
        }
        return _saleStates;
    }
}

protected string getSalesStates() {
    string output = "";
    int i = 0;
    foreach (KeyValuePair<string, string> entry in SalesStates) {
        output += ((i!=0) ? "," : "") + "\"" + entry.Key + "\":\"" + entry.Value + "\"";
        i++;
    }
    output = "{" + output + "}";
    return output;
}

在我的标记中:

<script type="text/javascript">var sales_states = <% Response.Write(this.getSalesStates()); %>;</script>

如果有人能帮我弄清楚为什么会发生这种情况,我将不胜感激。

【问题讨论】:

  • 请提供jsb_store_items的架构
  • 您的 jsb_store_items 表似乎没有名为 product_code 的列...请仔细检查。
  • @GendoIkari - 我预计错误会发生在adapter.Fill(tbl); 行上。
  • 架构确实包含请求的列。否则我会在测试期间收到此错误,但我不会。测试服务器和生产服务器都使用相同的数据库服务器。此外,在生产环境中,只有一些页面加载会导致错误,但每个页面请求都会运行此代码。
  • 我没有看到 conn.Open 语句。

标签: c# asp.net .net sql-server


【解决方案1】:

由于您只是填充字典,请尝试使用 SqlDataReader 而不是 DataTable 和 SqlDataAdapter。然后,您可以遍历结果集。这应该会快一点,做你需要的。

【讨论】:

  • 您能解释一下为什么这种方法应该解决问题中提出的问题吗?
  • 以前的代码是这样的,抛出了类似的错误。所以我将其更改为使用 DataTable。当我通过 DataReader 阅读时,这个想法是使连接打开的时间更长。无论哪种方式都会出现相同的错误。
【解决方案2】:

尝试在表名中添加[dbo]. 前缀,如下所示:

string sql = @"SELECT [product_code], [state] FROM [dbo].[jsb_store_items]";

如果没有 dbo 前缀,可能会发生奇怪的事情,尤其是在您无法直接控制自己创建对象的情况下,例如在生产环境中。

【讨论】:

    【解决方案3】:

    我已经测试了您在我的机器上发布的代码并且它可以工作。 需要数据库详细信息(例如表、字段等)以及您用于从数据库中获取数据的连接字符串。要查看为什么会出现问题?

    【讨论】:

      【解决方案4】:

      所以答案有点傻。在生产中,我们在负载均衡器后面有两个网络服务器,在某个时候,我决定通过直接点击它们来独立测试这两个服务器。这让我发现一台服务器在 90% 的时间里抛出错误,而另一台服务器在 0% 的时间里抛出错误。我为经常抛出它的服务器重新启动了网站和应用程序池,它似乎已经停止了。

      提示我的一件事是,我更新了错误记录例程以尝试记录有关错误的其他信息,但我仍然看到在没有更新详细信息的情况下抛出错误。

      我认为问题在于尽管更新了代码,但使用的 dll 还是旧的。这是一个网站,而不是一个 Web 应用程序,因此代码在第一次请求时被编译。通过重置网站,我认为它重新编译了所有内容,一切都开始按预期工作。

      我目前正在重写我们的部署脚本,以确保应用程序池和网站在代码更改时被重置/回收,以尝试防止将来出现此问题。

      感谢您的所有回复,我希望这在某些时候对其他人有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-18
        • 1970-01-01
        • 2019-06-09
        • 2014-07-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多