首页 / 浏览问题 / 组件GIS / 问题详情
Objects .net 借助数据库进行缓冲区创建报错
10EXP 2023年01月13日
        private void sqlToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Selection objSelect = map.FindSelection(true)[0];
            Recordset objSelectRd = objSelect.ToRecordset();
            objSelectRd.MoveFirst();
            string getName = objSelectRd.GetString(0);
            int id = Convert.ToInt32(getName);
            Datasources datasources = workspace1.Datasources;
            Datasource datasource = datasources[0];
            Datasets datasets = datasource.Datasets;
            for (int i = 0; i < datasets.Count; i++)
            {
                if (datasets[i].Name == "bufferriver")
                {
                    datasets.Delete("bufferriver");
                    MessageBox.Show("Delete Dataset Succes");
                    break;
                }
            }

            if (map.Layers.Contains("bufferriver@SDBSystem"))
            {
                map.Layers.RemoveByDataset(datasets["bufferriver"]);
                MessageBox.Show("删除成功");
            }


            string riverName = objSelectRd.GetFieldValue("name").ToString();
            int distance = getvalue();
            bool isSuccess = datasource.ExecuteSQL($"create table Bufferriver as select ST_Buffer(shape, {distance}, 'endcap=round join=round') from waterways where fid = {id};");
            if (isSuccess)
            {
                datasource.Refresh();
                Layer bufferLayer = map.Layers.Add(datasets["bufferriver"], true);
                LayerSettingVector bufferSetting = (LayerSettingVector)bufferLayer.AdditionalSetting;
                GeoStyle geoStyle = new GeoStyle();
                geoStyle.FillForeColor = Color.Orange;
                geoStyle.FillOpaqueRate = 50;
                bufferSetting.Style = geoStyle;
            }
            else
            {
                MessageBox.Show("创建失败");
            }
        }

由于实验需要,要在Objects .net中使用SQL进行缓冲区的创建,但第一次创建可以成功,之后再创建就会报错如下,除此之外,有时在添加map.Refresh()刷新地图时,也会报这个错。我感觉是因为Layer对象和map没有释放,但我写Dispose释放说连点对象不能显示释放。求大佬支招。

1个回答

您好,您这边是否已经测试确认,相同的代码使用文件型数据源不会出现这些问题?

如果是的话,建议您使用一下本机的数据库型数据源进行测试,因为从您的描述上来看,有时刷新地图会报错可能是因为数据库网络不稳定导致的。

同时,缓冲区操作也可以使用相同的数据库型数据源在iDesktop端进行重复缓冲区生成,定位确定到底是数据库型数据源问题还是代码逻辑问题。

希望可以帮助到您。
9,338EXP 2023年01月16日
...