为什么我的SQL连接没有返回请求的列?

时间:2015-12-01 20:41:15

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

我有一个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>

如果有人能帮助我弄清楚为什么会这样,我真的很感激。

4 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

尝试将[dbo].前缀添加到tablename,如下所示:

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

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

答案 2 :(得分:0)

我已经测试了您在我的机器上发布的代码,但它确实有效。 需要数据库详细信息(例如表,字段等)以及用于从数据库获取数据的连接字符串。要查看问题发生的原因吗?

答案 3 :(得分:0)

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

让我了解的一件事是,我更新了我的错误记录例程,尝试记录有关错误的其他信息,我仍然看到错误被抛出而没有更新的细节。

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

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

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