无法从DataTableReader对象获取表的名称

本文关键字:获取 对象 DataTableReader | 更新日期: 2023-09-27 18:21:20

我已经从XML文件创建了一个DataSet对象。

DataSet ds = new DataSet();
using (StreamReader sr = new StreamReader(file))
{
    XmlTextReader xmltext = new XmlTextReader(sr);
    ds = new DataSet();
    ds.ReadXml(xmltext);
}

然后我创建一个DataTableReader对象,并开始循环遍历每个表和每一行。

using (DataTableReader dtr = ds.CreateDataReader())
{
    while (dtr.NextResult())  // foreach table
    {
        // would like to access table name here
        while (dtr.Read())   // foreach row
        {
             ....

我的问题是,我想访问DataTableReader中每个表的名称,但似乎没有可供我使用的属性。

如果我检查DataTableReader对象,我会看到表名存储在一个名为"CurrentDataTable"的属性中,但这是一个非公共成员,我无法访问它。

我还尝试在返回DataTable对象的DataTableReader上使用"GetSchemaTable"函数。起初,这似乎很有希望,但DataTable对象的"TableName"属性的值为"SchemaTable",这是不正确的。

无法从DataTableReader对象获取表的名称

所以我找到了解决办法。我发现还有一些其他StackOverflow答案,建议使用反射来访问非公共成员。

此代码允许我访问正在查找的字符串。

PropertyInfo pInfo = dtr.GetType()
     .GetProperties(BindingFlags.NonPublic | BindingFlags.Instance)
     .Single(x => x.Name == "CurrentDataTable");
pInfo.GetValue(dtr, null).ToString();

虽然这在技术上是可行的,但它感觉像是一种非常笨拙的方式来完成看似微不足道的事情。

肯定有更好的方法吗?