Data Store是一系列的集成对象的数据仓储,对于文件类型的Provider来说,一个Data Store往往就是一个文件。存储在Data Store中的对象可以被建模为一个或多个模式中的类或要素类,这意味着一个Data Store中可以包含一个或多个模式。
FDO提供了两种命令FdoICreateDataStore和FdoIListDataStores分别用于创建Data Store和枚举Data Store。
使用命令FdoICreateDataStore可以创建一个Data Store。通常情况下,创建和执行一个FDO命令需要一个打开的FDO连接,但是命令FdoICreateDataStore是一个特例,它并不需要FDO连接是打开的。
对于不同的Provider,创建一个Data Store需要不同的参数,调用方法FdoICreateDataStore:: GetDataStoreProperties()会得到一个FdoIDataStorePropertyDictionary字典对象,这个字典对象中包含了来创建一个Data Store所需的参数,用户可以使用这个字典对象设置这些参数的值。查阅Provider的帮助文档,也可以得到创建一个Data Store所需的参数。
如下的代码展示了如何创建一个SDF Data Store,即一个SDF文件。一般情况下,在创建完成Data Store之后,需要打开这个FDO连接,然后创建模式、要素类和空间上下文,最后在Data Store中插入要素。
// 创建FDO连接 FdoPtr<IConnectionManager> manager = FdoFeatureAccessManager::GetConnectionManager (); FdoPtr<FdoIConnection> conn = manager->CreateConnection (L"OSGeo.SDF")); // 创建命令 FdoPtr<FdoICreateDataStore> createCmd = (FdoICreateDataStore*) conn->CreateCommand(FdoCommandType_CreateDataStore); // 获得创建一个Data Store所需的参数 FdoPtr<FdoIDataStorePropertyDictionary> dictionary = createCmd->GetDataStoreProperties(); int count; FdoString **names = dictionary->GetPropertyNames(count); dictionary->SetProperty(names[0], L"test.sdf"); // 执行命令 createCmd->Execute(); // 打开连接 conn->SetConnectionString(L"File=test.sdf"); conn->Open(); // 创建模式、要素类和空间上下文 ...... // 插入要素 ...... |
在9.4.3.2我们曾经较少过两步连接。例如创建对MySQL和ArcSDE Provider的连接时,第一步可以不指定Data Store参数,在第一步连接完成后可以执行FdoIListDataStores命令枚举数据源中所有Data Store。
对于RDBMS类型的Provider,每个FDO类型的Data Store包含了一些原数据用于描述模式、要素类、空间上下文等信息,如果想枚举数据源中非FDO类型的Data Store,那么只需要调用方法FdoIListDataStores::SetIncludeNonFdoEnabledDatastores()即可实现这样的功能。
假设用户已经安装了MySQL,并且在安装时设置了系统管理员帐号名为“root”,密码为“test”,以下是创建MySQL Provider连接的基本步骤。
FdoPtr<FdoConnectionManager> connectMgr = (FdoConnectionManager *)FdoFeatureAccessManager::GetConnectionManager(); FdoPtr<FdoIConnection> fdoConnection = connectMgr->CreateConnection(L”OSGeo.MySQL.3.4”); // 设置连接字符串 fdoconnection->SetConnectionString(L”Username=root;Password=test;Service=localhost”); // 打开连接 FdoConnectionState state = fdoConnection->Open(); // 创建命令 FdoPtr<FdoIListDataStores> listDataStoresCmd = (FdoIListDataStores*) connection->CreateCommand(FdoCommandType_ListDataStores); // 设置包含非FDO类型的Data Store listDataStoresCmd->SetIncludeNonFdoEnabledDatastores(true); // 执行命令 FdoPtr<FdoIDataStoreReader> reader = listDataStoresCmd->Execute(); // 遍历所有的Data Store while ( reader->ReadNext() ) { FdoString* dsName = pReader->GetName(); FdoString* dsDesc = pReader->GetDescription(); bool isFdoEnabled = pReader->GetIsFdoEnabled(); FdoPtr<FdoIDataStorePropertyDictionary> dictionary = reader->GetDataStoreProperties(); FdoInt32 count = 0; FdoString** names = dictionary->GetPropertyNames(count); for ( int i = 0; i < count; i++) { FdoString* name = names[i]; bool propertyRequired = dictionary->IsPropertyRequired(name); bool propertyEnumerable = dictionary->IsPropertyEnumerable(name); bool propertyProtected = dictionary->IsPropertyProtected(name); const wchar_t *propertyLocalized = dictionary->GetLocalizedName(name); bool propertyFile = dictionary->IsPropertyFileName(name); bool propertyDatastore = dictionary->IsPropertyDatastoreName(name); bool propertyPath = dictionary->IsPropertyFilePath(name); FdoString* value = dictionary->GetProperty(name); int n = 0; if ( propertyEnumerable ) { FdoString** enums = dictionary->EnumeratePropertyValues(name, n); for ( int j = 0; j < n; j++ ) { FdoString* enumValie = enums[j]; } } } } |