无法从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",这是不正确的。
所以我找到了解决办法。我发现还有一些其他StackOverflow答案,建议使用反射来访问非公共成员。
此代码允许我访问正在查找的字符串。
PropertyInfo pInfo = dtr.GetType()
.GetProperties(BindingFlags.NonPublic | BindingFlags.Instance)
.Single(x => x.Name == "CurrentDataTable");
pInfo.GetValue(dtr, null).ToString();
虽然这在技术上是可行的,但它感觉像是一种非常笨拙的方式来完成看似微不足道的事情。
肯定有更好的方法吗?