【问题标题】:"DataTable already belongs to another DataSet"“DataTable 已经属于另一个 DataSet”
【发布时间】:2013-12-21 04:08:45
【问题描述】:

我无法弄清楚为什么我会收到“DataTable 已属于另一个 DataSet”异常。

这是我的代码:

DataSet AlertSet = new DataSet();

DataTable generalAlertData = new DataTable("GeneralAlertData");
generalAlertData = //function that returns datatable

//throws exception
AlertSet.Tables.Add(generalAlertData)

何时创建另一个数据集,何时将 generalAlertData 数据表添加到其中?

我尝试使用稍微不同的语法来创建和添加表,但得到了相同的错误:

DataSet AlertSet = new DataSet();

DataTable generalAlertData = //function that returns datatable

//throws exception
AlertSet .Tables.Add(generalAlertData);

【问题讨论】:

    标签: c# asp.net exception datatable dataset


    【解决方案1】:

    这取决于检索数据表的函数的作用。
    如果该函数使用DataAdapter 并填充数据集,那么您将自动分配表的DataSet 属性,您需要在分配不同的数据集之前将其删除

    您可以尝试删除原始数据集并使用您自己的

        DataTable generalAlertData = GetTable();
        DataSet u = generalAlertData.DataSet;
        u.Tables.Remove(generalAlertData.TableName);
        AlertSet.Tables.Add(generalAlertData);
    

    所以,如果您假设的 GetTable 以这种方式工作

    public DataTable GetTable()
    {
        ...
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        DataSet ds = new DataSet();
        da.Fill(ds);
        return ds.Tables[0];
    }
    

    然后您将 DataSet 分配给返回的数据表。
    相反,此代码不会为 DataSet 属性分配任何内容

    public DataTable GetTable()
    {
        ...
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        DataTable dt = new DataTable();
        da.Fill(dt);
        return dt;
    }
    

    【讨论】:

      【解决方案2】:

      从方法调用返回的DataTable 被添加到DataSet。确保它没有添加到DataSet;只需建立一个独立的DataTable

      附带说明,从分配给此方法调用的方法调用返回 DataTable 会使上面的行无关紧要(new)。

      【讨论】:

        【解决方案3】:

        这是一个老问题,但也许这个答案会对其他人有所帮助。

        我也收到了这个错误。我查看了我的源代码,实际上没有发现其他数据集,并且对为什么会发生这种情况感到困惑。

        我的问题的解决方案是在我的数据访问库中。它没有“getDataTable”例程,但我确实有一个 getDataset 例程。当我只需要一个数据表时,我调用了 getDataset 并获取了 tables(0) 数据表实例。

        这样做的最终结果是我按我想要的方式取回了我的数据表,但数据表已经是我的数据访问调用返回的数据集的一部分。因此,错误。

        我必须在我的数据访问库中添加一个 getDatatable 例程来消除这个问题。

        【讨论】:

          【解决方案4】:

          我遇到了同样的问题,我使用Remove 解决了它。在我看来,您的代码可能是这样的:

          DataSet AlertSet = new DataSet();
          
          DataTable generalAlertData = new DataTable("GeneralAlertData");
          
          AlertSet.Tables.Add(generalAlertData);
          AlertSet.Tables.Remove(generalAlertData);
          

          请告诉我此代码是否有效。

          我的工作代码是这样的:

          DataTable myTable = new DataTable();
          
          private void Save()
          {
              DataSet myDataSet = new DataSet();
              myDataSet.Tables.Add(myTable);
              myDataSet.Tables.Remove(myTable);//This works
              myDataSet.WriteXml("myTable.xml");
          }
          
          private void buttonSave_Click(object sender, EventArgs e)
                  {
                    Save();
                  }
          

          每次我点击按钮buttonSave,都会出现“DataTable已经属于另一个DataSet”的消息。写了myDataSet.Tables.Remove(myTable);//This works这行代码后,应用程序开始运行没有问题,现在我可以多次点击按钮,没有丢失 myTable 的值并且没有错误消息。

          我希望这会有所帮助。

          【讨论】:

          • 抱歉,myDataSet.Tables.Remove(myTable);//This works 行代码(在我上面的代码中)必须在 myDataSet.WriteXml("myTable.xml"); 之后,我确认代码有效。
          猜你喜欢
          • 2012-02-08
          • 2023-03-28
          • 2021-02-21
          • 2012-03-11
          • 1970-01-01
          • 2011-06-21
          • 1970-01-01
          • 2017-06-01
          • 2022-01-18
          相关资源
          最近更新 更多