"DataTable已经属于另一个DataSet"

dmr*_*dmr 4 c# asp.net datatable exception dataset

我无法弄清楚为什么我得到一个"DataTable已经属于另一个DataSet"的例外.

这是我的代码:

DataSet AlertSet = new DataSet();

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

//throws exception
AlertSet.Tables.Add(generalAlertData)
Run Code Online (Sandbox Code Playgroud)

何时创建另一个数据集以及何时添加generalAlertData数据表?

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

DataSet AlertSet = new DataSet();

DataTable generalAlertData = //function that returns datatable

//throws exception
AlertSet .Tables.Add(generalAlertData);
Run Code Online (Sandbox Code Playgroud)

Ste*_*eve 7

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

您可以尝试这样删除原始DataSet并使用您自己的DataSet

    DataTable generalAlertData = GetTable();
    DataSet u = generalAlertData.DataSet;
    u.Tables.Remove(generalAlertData.TableName);
    AlertSet.Tables.Add(generalAlertData);
Run Code Online (Sandbox Code Playgroud)

所以,如果你的假设GetTable以这种方式运作

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

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

public DataTable GetTable()
{
    ...
    SqlDataAdapter da = new SqlDataAdapter(cmd);
    DataTable dt = new DataTable();
    da.Fill(dt);
    return dt;
}
Run Code Online (Sandbox Code Playgroud)