在Geodatabase中,要素类可以直接存储在数据库中,也可以存储在数据集中。数据集(Dataset)是一个代表了Workspace中所谓数据集合的抽象类,它是一个集合,但是在理解数据集对象的时候,要用广义的概念来看待,不要从我们在数据库里存储的那个物理结构去理解,否则会走入误区,因为在设计数据库的时候,我们可以在数据集里面存储相关的要素类。那么我们在编程的时候就可以这么想,要获取数据库中的某一个要素类,要先获取数据集,然后获取要素类,其实通过工作空间IFeatureWorkspace.OpenFeatureClass就可以,可以把数据库比作文件夹,数据集比作子文件夹,但是在数据库中的表,要素类,是没有重复的,不像Windows上的文件夹,子文件夹里面可以有名称重复的文件,刚才说到用广义的意义,应该知道所有放在工作空间的对象都是一种数据集对象,也就是说Table,FeatureClass等都是数据集,也就是说数据集中的数据可以是一个字段,一行记录,一张表等。Workspace其实也是一种数据集,它也继承了IDataset这个接口。在数据库中一切对象都可以看做是数据集,不管是要素类,还是表,或者栅格数据,那么怎么区分我们得到的到底是表,还是要素类?IDataset有一个很重要的属性IDataset.Type,通过这个属性我们就可以判断,IDataset.Type的这个属性是一个枚举类型的常量,如下图
获取数据库中的要素类
在AE中,要得到某一个类,首要要获取工作空间,然后进入工作空间再得到相应的东西,我们定义一个函数用来获取个人数据库的路径
public string WsPath()
{
string WsFileName="";
OpenFileDialog penFile = new OpenFileDialog();
OpenFile.Filter = "个人数据库(MDB)|*.mdb";
DialogResult DialogR = OpenFile.ShowDialog();
if (DialogR == DialogResult.Cancel)
{
}
else
{
WsFileName = OpenFile.FileName;
}
return WsFileName;
}
要获取要素类,首先要进入
private void button2_Click(object sender, EventArgs e)
{
string WsName = WsPath();
if (WsName != "")
{
IWorkspaceFactory pWsFt = new AccessWorkspaceFactoryClass();
IWorkspace pWs = pWsFt.OpenFromFile(WsName, 0);
IEnumDataset pEDataset = pWs.get_Datasets(esriDatasetType.esriDTAny);
IDataset pDataset = pEDataset.Next();
while (pDataset != null)
{
if (pDataset.Type ==esriDatasetType.esriDTFeatureClass)
{
FeatureClassBox.Items.Add(pDataset.Name);
}
//如果是数据集
else if (pDataset.Type == esriDatasetType.esriDTFeatureDataset)
{
IEnumDataset pESubDataset = pDataset.Subsets;
IDataset pSubDataset = pESubDataset.Next();
while (pSubDataset != null)
{
FeatureClassBox.Items.Add(pSubDataset.Name);
pSubDataset = pESubDataset.Next();
}
}
pDataset = pEDataset.Next();
}
}
FeatureClassBox.Text = FeatureClassBox.Items[0].ToString();
}