2015-12-01 115 views
0

我有一個ASP.NET網站(運行v2.0)和一個SQL Server數據庫(2012),當很多人打開頁面時,出現一個奇怪的錯誤。錯誤是:爲什麼我的SQL連接不能返回請求的列?

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

請提供'jsb_store_items'的模式 –

+0

看來您的jsb_store_items表沒有名爲product_code的列...請仔細檢查。 – GendoIkari

+0

@GendoIkari - 我希望錯誤發生在'adapter.Fill(tbl);'然後。 – Igor

回答

0

所以答案有點傻。在生產中,我們在負載平衡器後面有兩個Web服務器,並且在某個時候我決定直接點擊它們來獨立測試兩臺服務器。這讓我發現一個服務器在90%的時間內拋出錯誤,而在0%的時間內拋出一個服務器。我重新啓動了經常拋出它的服務器的網站和應用程序池,它似乎已停止。

我提到的其中一個問題是我更新了錯誤日誌記錄例程以嘗試記錄有關錯誤的其他信息,並且我仍然看到沒有更新的細節時會拋出錯誤。

我認爲問題是即使代碼被更新,使用的DLL也是舊的。這是一個網站,而不是一個Web應用程序,所以代碼在第一次請求時被編譯。通過重新設置網站,我認爲它重新編譯了所有內容,並且事情按照預期開始工作。

我目前正在重寫我們的部署腳本,以確保應用程序池和網站在代碼更改時重置/回收,以便在將來嘗試並防止出現此問題。

謝謝你的回覆,我希望這可以幫助別人。

0

由於您只是填充字典,請嘗試使用SqlDataReader而不是DataTable和SqlDataAdapter。然後你可以遍歷結果集。這應該快一點,並做你所需要的。

+0

你能解釋爲什麼這種方法應該解決問題中提出的問題嗎? – Steve

+0

代碼曾經是這樣的,並且拋出了類似的錯誤。所以我將它改爲使用DataTable。這種想法讓我在閱讀DataReader的過程中打開了更長的連接。無論哪種方式都有同樣的錯誤。 –

0

嘗試增加[dbo].前綴表名,像這樣:

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

奇怪的事情都可能發生,而不DBO前綴,特別是如果你沒有創建自己的對象,如在生產的直接控制環境。

0

我測試了你在我的機器上發佈的代碼,它的工作原理。 需要數據庫詳細信息(例如,表格,字段等)也是您用來從數據庫中獲取數據的連接字符串。要查看問題出現的原因?

相關問題