我有一个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>
如果有人能帮助我弄清楚为什么会这样,我真的很感激。
答案 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应用程序,因此代码会在第一次请求时编译。通过重置网站,我认为它重新编译了一切,事情开始按预期工作。
我目前正在重写我们的部署脚本,以确保在代码更改时重置/回收应用池和网站,以便将来尝试防止此问题。
感谢您的所有回复,我希望这会在某些时候帮助其他人。