//连接ArcSDE数据库
rc=SE_connection_create(server,instance,database,user,passwd,&Connect_error,&Connection);
//为查询定义一个数据流
rc=SE_stream_create(Connection,&Stream);
//为一个SE_SQL_CONSTRUCT结构体分配空间
rc=SE_sql_construct_alloc(1,&sqlc);
//定义查询方式、内容、范围
sqlc->where=malloc(20);
sqlc->num_tables=1;
strcpy(sqlc->tables[0],"factories");
strcpy(sqlc->where,"工厂人数<100");
//定义要返回的字段的个数和名称
num_cols=3;
attrs=(CHAR**)malloc(num_cols*sizeof(CHAR*));
attrs[0]="工厂名称";
attrs[1]="工厂面积";
attrs[2]="工厂人数";
//使用前面定义好的查询结构体来定义数据流查询
rc=SE_stream_query(Stream,num_cols,attrs,sqlc);
rc=SE_stream_execute(Stream);
//在结果集中进行循环
while(rc==SE_SUCCESS)
{
rc=SE_stream_fetch(Stream);
if(rc==SE_SUCCESS)
{
rc=SE_stream_get_string(Stream,1,name);
rc=SE_stream_get_double(Stream,2,&area);
rc=SE_stream_get_integer(Stream,3,&population);
//。。。。下面就可以对name,area,population进行操作了
}
}
//释放数据流
rc=SE_stream_free(Stream);
free(attrs);
//释放前面给SE_SQL_CONSTRUCT结构体开辟的空间
free(sqlc->where);
SE_sql_construct_free(sqlc);
//断开与ArcSDE的数据库连接
SE_connection_free(Connection);
2、空间查询:下面要在factoris表中检索出所有落在一个以点(X,Y)为圆心,10km为半径的圆形范围内的所有记录。
SE_SHAPE Shape;
SE_POINT Point;
SE_FILTER Filter;
LFLOAT radius;
LONG max_points;
//创建一个以指定的点(X,Y)为圆心,10公里为半径的圆,它作为空间约束条件
//假定数据库中的坐标单位是米
Point.x=X;
Point.y=Y;
radius=10000.0;
//假设已经调用SE_shape_create函数创建了Shape
rc=SE_shape_generate_circle(Point,radius,max_points,Shape);
//定义空间过滤器
strcpy(Filter.table,"factories");
strcpy(Filter.column,"工厂边界");
Filter.filter.shape=Shape;
//定义查询所依据的空间关系,SE_AI表示选取所有与Shape相交的空间目标
Filter.method=SM_AI;
Filter.truth=TRUE;
Filter.filter_type=SE_SHAPE_FILTER;
//用前面定义的空间约束来定义当前的数据流操作
rc=SE_stream_get_spatial_constraints(Stream,SE_SPATIAL_FIRST,FALSE,1,&Filter);
//下面就可以在结构集中进行循环
3、下面是用MO从ArcSDE数据库中调出数据过程:
(1)、连接数据库
(2)、在库中选择需要的数据
(3)、将所选择的数据作为MO的一个图层加入到当前视图中进行显示
下面是一个例子:
CMap1 map;
LPCTSTR server;
LPCTSTR user, password, db, color;
//连接数据库
CMoDataConnection conn;
If(!conn.CreateDispatch(TEXT("MapObjects2.DataConnection"))
Throw "不能创建MapObjects的连接对象";
conn.SetServer(server);
conn.SetUser(user);
conn.SetPassword(password);
conn.SetDatabase(db);
If(!conn.Connect())
Throw "连接道路数据库失败!";
//设置要调出显示的道路数据,这里我们假定选择库中道路数据列表的第一个数据
CMoGeoDatasets sets;
VARIANT va;
VariantInit(&va);
Va.vt=VT_I4;
va.lVal=0;//设置为第一个数据
sets=conn.GetGeoDatasets();
CMoGeoDataset getDataset=sets.Item(va);
//将选择的道路数据添加到Map控件的图层列表中
CMoLayers layers(map.GetLayers());
CMoMapLayer layer;
If(!layer.CreateDispatch(TEXT(MapObjects2.MapLayer")))
Throw "不能创建MapObjects图层";
layer.SetDataset(geoDataset);
If(color!=-1)
{
CMoSymbol layerSymbol(layer.GetSymbol());
layerSymbol.SetColor(color);
}
//将选择的道路数据添加到Map控件的图层列表中
layers.Add(layer);