数据表已经属于另一个数据集

5
我不明白为什么会出现“DataTable already belongs to another 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);
4个回答

8
这取决于检索数据表的函数。如果该函数使用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分配给返回的datatable。
相反,这段代码没有将任何内容分配给 DataSet 属性

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

2

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

顺便提一下,从分配给该DataTable的方法调用返回DataTable会使上面的行(new)无关紧要。


0

这是一个旧问题,但也许这个答案会帮助其他人。

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

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

这样做的最终结果是,我得到了我想要的datatable,但是datatable已经是从我的数据访问调用返回的数据集的一部分。因此,出现了错误。

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


0

我曾经遇到过同样的问题,我使用了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 already belongs to another DataSet”的消息。 写入代码行myDataSet.Tables.Remove(myTable);//This works后,应用程序开始正常运行,现在我可以多次单击该按钮,而不会丢失myTable的值,也不会出现错误消息。
希望这可以帮助到您。

抱歉,myDataSet.Tables.Remove(myTable);//This works 这行代码(在上面的代码中)必须在 myDataSet.WriteXml("myTable.xml"); 之后。我确认这段代码是有效的。 - GMarco1989

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接