C# 为什么我的SQL连接不返回请求的列?

C# 为什么我的SQL连接不返回请求的列?,c#,asp.net,.net,sql-server,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 这似乎表明线程之间存在某种连接共享,但我似乎不明白为什么。在代码背后,我

我有一个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;
}
private Dictionary\u saleStates=null;
受保护的字典状态{
得到{
如果(_saleStates==null)
{
_saleStates=新字典();
字符串sql=@“从[jsb_商店项目]中选择[product_code],[state]”;
使用(DataTable tbl=newdatatable())
{
使用(SqlConnection conn=newsqlconnection(System.Configuration.ConfigurationManager.ConnectionStrings[“Shop.DbConnection”].ConnectionString))
{
使用(SqlCommand cmd=newsqlcommand(sql,conn))
{
使用(SqlDataAdapter=newsqldataadapter(cmd))
{适配器填充(tbl);}
}
}
如果(tbl.Rows.Count>0)
{
foreach(tbl.Rows中的数据行)
{
if(!row.IsNull(“产品代码”)和&!row.IsNull(“状态”)//此处引发错误
{{u saleStates.Add(第[“产品代码”].ToString().ToLower(),salesstateText(第[“状态”].ToString().ToLower());}
}
}
}
}
返回销售状态;
}
}
受保护的字符串GetSalesState(){
字符串输出=”;
int i=0;
foreach(SalesState中的KeyValuePair条目){
输出+=((i!=0)?”,“:”)+“\”+项。键+“\”:\”+项。值+“\”;
i++;
}
output=“{”+输出+“}”;
返回输出;
}
在我的标记中:

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

如果有人能帮我找出发生这种情况的原因,我将不胜感激。

因为您只是在填充字典,请尝试使用SqlDataReader,而不是DataTable和SqlDataAdapter。然后,您可以循环遍历结果集。这应该会快一点,并执行您需要的操作。

尝试向tablename添加
[dbo]。
前缀,如下所示:

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

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

我已经测试了您在我的机器上发布的代码,它可以正常工作。
需要数据库详细信息(例如表、字段等)以及用于从数据库获取数据的连接字符串。要了解问题发生的原因?

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

其中一件让我感到困惑的事情是,我已经更新了我的错误日志例程,试图记录关于错误的其他信息,但我仍然看到错误被抛出,没有更新的细节

我认为问题在于,尽管代码正在更新,但所使用的DLL还是旧的。这是一个网站,而不是一个web应用程序,所以代码会在第一次请求时编译。通过重新设置网站,我认为它重新编译了一切,一切都开始按预期运行

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


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

请提供
jsb_store_items
的模式。您的jsb_store_items表似乎没有名为product_code的列。。。仔细检查。@GendoIkari-我希望在
adapter.Fill(tbl)行上出现错误然后。架构不包括请求的列。否则,我会在测试期间出现这个错误,而我不会。测试服务器和生产服务器都使用相同的数据库服务器。另外,在生产环境中,只有一些页面加载会导致错误,但每个页面请求都会运行此代码。我没有看到conn.Open语句。您能解释一下为什么这种方法会解决问题中提出的问题吗?代码过去是这样的,并引发类似的错误。所以我把它改成使用数据表。我的想法是,当我通过DataReader阅读时,使连接打开的时间更长。不管哪种方式都是相同的错误。