DataTable中的System.Data.DuplicateNameException

时间:2013-03-16 12:08:05

标签: c# asp.net

我正在动态地将列添加到!IsPostBack中的静态数据表。

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”的列已属于此DataTable。

有人可以告诉我如何解决这个问题

2 个答案:

答案 0 :(得分:3)

static中的ASP.NET(多线程)对于所有请求都意味着 ,因此即使是访问此页面的其他用户也使用{{1}的同一个实例}}。所以这就是原因。

解决方案是不要让它静止。

你必须使用不同的方式在回发中维护它(例如Session,ViewState等)。

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

注意:我甚至不会将它用作字段,而是作为返回它的方法中的局部变量。通过这种方式,您可以在需要该数据的任何地方使用此方法。通常将它绑定到像DataTable这样的webdatabound控件,它通过GridView在回发中维护它的值。所以你不需要维护表本身。

答案 1 :(得分:3)

静态数据表意味着无论您的网页实例如何,它都将始终存在。因此,当您第一次运行网页时,您的Page_Load会创建数据表,一切都很好。

但是当您第二次加载该页面或者其他人尝试加载您的页面时,数据表仍然存在,因为它是静态的,因此您尝试在数据表已经存在时向其添加列。

你可以通过3种方式解决这个问题:
1。删除然后再次添加列。不要做这件事,在每个方面都是多余的和坏的代码 2。在dtp.Columns.Adds周围添加if语句,以确保它仅在第一次加载页面时运行它们。你可以查看是否存在columnds,你可以创建一个bool标志,或者你想到的其他方法。
3。从变量声明中删除静态,以便每次页面加载新数据表时都会创建。如果这样做,那么您可能希望将数据表基于静态数据源。