2013-03-16 54 views
5

我正在動態地將列添加到!IsPostBack中的靜態數據表中。DataTable中的System.Data.DuplicateNameException

static DataTable dtflow = new DataTable(); 

protected void Page_Load(object sender, EventArgs e) 
    { 

     if (!IsPostBack) 
     { 
      dtp.Columns.Add("slno"); 
      dtp.Columns.Add("portname"); 
      dtp.Columns.Add("type"); 
      dtp.Columns.Add("portid"); 
      dtp.Columns.Add("longitude"); 
      dtp.Columns.Add("latitude"); 
      dtp.Columns.Add("add1"); 
      dtp.Columns.Add("add2"); 
      dtp.Columns.Add("dist"); 
      dtp.Columns.Add("state"); 
      dtp.Columns.Add("country"); 
     } 
    } 

但是當我運行我的網站第二次就這樣表示

異常詳細信息異常:System.Data.DuplicateNameException:名爲「slno」 A柱已經屬於這個數據表。

誰能告訴我如何解決這個問題

回答

2

靜態數據表示它將永遠存在,無論您的網頁的實例如何。因此,當您第一次運行網頁時,Page_Load會創建數據表,並且一切都很好。

但是當你加載頁面第二次或如果別人試圖加載頁面,則該數據表仍然存在,因爲它是靜態的,所以你的努力時,他們已經存在列添加到您的數據表。

3種方式,你可以解決這個問題:
1.刪除,然後重新添加列。千萬不要這樣做,它在各個方面都是多餘的,糟糕的代碼。
2.添加的,如果在你的dtp.Columns.Adds聲明,以確保它只能運行他們第一次加載頁面。你可以查看是否存在柱子,你可以創建一個布爾標誌,或者你想到的另一個意思。
3.從您的變量聲明靜態的,因此,每一次頁面加載一個新的數據表上創建的。如果你這樣做,那麼你可能想從靜態數據源中取出數據表。

3

staticASP.NET(多線程)是指所有請求,讓誰去這個頁面,即使其他用戶正在使用的同一個實例DataTable。所以這就是原因。

解決方法是不要使其變爲靜態。

你必須使用一個不同的方式在回發(例如會話,ViewState的等),維護它。

Nine Options for Managing Persistent User State in Your ASP.NET Application

注:我不會用它作爲場,但在返回它的方法的局部變量。這樣你就可以在需要這些數據的地方使用這種方法。通常情況下,您將其綁定到像GridView這樣的webdatabound控件,該控件通過ViewState通過回傳保持其值。所以你不需要維護表格本身。