首页 / 浏览问题 / 组件GIS / 问题详情
C#新建矢量数据集无法查询
2EXP 2021年07月22日

我用Datasource.Datasets.Create(datasetVectorInfo,prjCoordSys)创建的矢量数据集,但是连上这个Datasource之后获取到创建的DatasetVector调用datasetVector.GetRecordset(false, CursorType.Dynamic)之后返回的Recordset是null,不知道是什么原因导致的。

我在创建DatasetVector之前操作过从prj坐标系文件获取的PrjCoordSys给Datasource,翻到执行之后的iObjects的log日志有这样一段记录:

2021-07-21 18:24:29 [error] 获取数据失败, ThreadID: 26080, Timespan(ms): 0, ResourceID: ELc083, SourceCode: D:\TeamCity\UGO1010\01_SourceCode\Src\EnginePG\UGEditRecordsetPG.cpp(286)
2021-07-21 18:24:49 [error] 错误:  字段 smdtv_1.smgeoposition 不存在
LINE 1: ...1.fldm, SMDTV_1.ssqy, SMDTV_1.ysdm, SMDTV_1.zdmj, SMDTV_1.Sm...
                                                             ^
, ThreadID: 26080, Timespan(ms): 19593, ResourceID: -100, SourceCode: D:\TeamCity\UGO1010\01_SourceCode\Src\EnginePG\UGEditRecordsetPG.cpp(377)
2021-07-21 18:24:49 [error] 获取数据失败, ThreadID: 26080, Timespan(ms): 0, ResourceID: ELc083, SourceCode: D:\TeamCity\UGO1010\01_SourceCode\Src\EnginePG\UGEditRecordsetPG.cpp(286)

从prj文件获取PrjCoordSys:

PrjCoordSys pRef;
            string sProPath = string.Format(@"{0}\Templates\SMFrame\Coordinate Systems\预定义坐标系\Geographic Coordinate Systems\Asia\{1}.prj", sSysPath, sProName);
           
            if (!File.Exists(sProPath))
            {
                sProName = GetPureGeoPRJFileName(sProName);
                sProPath = sSysPath + @"\Templates\SMFrame\Coordinate Systems\预定义坐标系\Geographic Coordinate Systems\Asia\" + sProName + ".prj";
                if (!File.Exists(sProPath))
                {
                    pRef = null;
                    //// 自定义空间参考
                    //string sDefaultPath = sSysPath + @"\sys\Coordinate Systems\预定义坐标系\Geographic Coordinate Systems\Asia\China Geodetic Coordinate System 2000.prj";
                    //pRef = pSpatialReferenceFactory.CreateESRISpatialReferenceFromPRJFile(sDefaultPath);
                }
                else
                {
                    pRef = new PrjCoordSys();
                    pRef.FromFile(sProName, PrjFileType.Esri);
                }
            }
            else
            {
                pRef = new PrjCoordSys();
                pRef.FromFile(sProName, PrjFileType.Esri);
            }

Datasrouce设置坐标系:

 m_TarSpr = Comm.GetSpatialReference(this.popZBX.Text, sSysPath, dMeridian, m_dXYTolerence, m_dXYResolution);

//// 数据源修改空间参考
m_TarDatasource.PrjCoordSys = m_TarSpr;

矢量数据集创建:

try
                    {
                        DatasetVectorInfo datasetVectorInfo = new DatasetVectorInfo();
                        datasetVectorInfo.Name = pDsVInfo.Name;
                        datasetVectorInfo.Type = pDsVInfo.DsType;
                        datasetVectorInfo.IsFileCache = true;

                        //// 初始化图层
                        //DatasetVector datasetVector = m_TarDatasrouce.Datasets.Create(datasetVectorInfo, m_TarDatasrouce.PrjCoordSys);
                        DatasetVector datasetVector = m_TarDatasrouce.Datasets.Create(datasetVectorInfo, m_Prj);
                        if (datasetVector == null)
                        {
                            sError = string.Format("图层【{0}】创建失败。", pDsVInfo.Name);
                            m_lstImportResult.Add(new ImportResult(pDsVInfo.Name, "失败", "图层创建失败"));
                            m_FailCount++;
                            continue;
                        }

                        //datasetVector.PrjCoordSys = m_TarDatasrouce.PrjCoordSys;

                        //// 初始化字段
                        foreach (SuperMap.Data.FieldInfo pFldInfo in pDsVInfo.FldInfos)
                        {
                            datasetVector.FieldInfos.Add(pFldInfo);
                        }

                        m_SuccessCount++;
                        m_lstImportResult.Add(new ImportResult(pDsVInfo.Name, "成功", "图层创建成功"));
                    }
                    catch(Exception ex)
                    {
                        m_lstImportResult.Add(new ImportResult(pDsVInfo.Name, "失败", ex.Message));
                        m_FailCount++;
                    }

矢量数据集导入记录获取Recordset:

        public static Recordset GetRecordSet(Dataset dataset)
        {
            if (dataset == null)
            {
                return null;
            }

            try
            {
                return (dataset as DatasetVector).GetRecordset(false, CursorType.Dynamic);
            }
            catch
            {
                return null;
            }
        }

补充:
1、坐标系获取是直接读取的ArcGIS的坐标系文件(.prj),iObject.Net支持PrjCoordSys.FromFile()传.prj文件路径获取,方法的第二个参数传【PrjFileType.Esri】即可,获取到的PrjCoordSys正常;

2、创建出来的DatasetVector能在SuperMap iDesktop中正常读到,可以右键【查看属性】,能看到创建时候设置的坐标系,只是矢量数据集的记录数为0而已。但是代码获取到的Recordset是null,而不是RecordCount为0的实例;

3、之所以贴出来的代码有变量名出入,因为设置坐标系、创建图层以及获取Recordset的方法都是封装的,只贴出来关键处理逻辑,如果传进去的dataset就已经是null了,那我就没必要在这里提问了。

问题关闭原因: 问题已经解决

2 个回答

您好,您用的是Iobject .net的话,

看到您在坐标系处使用的PrjCoordSys.FromFile()方法,该方法如果type默认需要的是xml文件,您使用的是否正确,坐标系是否成功创建了?

您的recordset方法范围会空,那您是否有调试是if路线还是esle路线出来的,是否是传入的dataset就已经空了呢?

希望可以帮助到您!
9,338EXP 2021年07月22日
您后续追问可以直接下面发新的评论,直接修改原问题、评论系统是不会提示我们的。

您的代码中是还有catch去return的,我们的GetRecordset方法是没法返回null的。

您的null是否是try执行失败报错,抛到catch中返回的null?
9,338EXP 2021年07月22日
上礼拜这个库创建图层还是可以的,我用本地的UDBX和UDB都没问题,应该是PostgreSQL库的问题。
嗯,这样的话确实可能是数据库结构映射或者连接关系出问题了。

可以新建一个PostgreSQL型数据源看看有没有问题,最好情况没有问题把数据迁移过来就行了。

如果新建一个数据源也不行的话,就要排查下数据库问题了。
不过很奇怪的是我用SuperMap iDesktop软件打开这个数据源,右键图层-查看属性表没有任何问题,但是代码执行就不行了。。

重新验证了下,没有解决,执行情况很不稳定,时好时坏的。我自己在本机部署了一个PostgreSQL库也一样的。

不知道是不是我调用的iObject的问题还是啥,获取Recordset很不稳定,时好时坏;本来程序打算实现的就是拿Recordet批量导入数据的,后来绕开Recordset了,改用DatasetVector.Append(recordsetsource,sourceFldArrary,targetFldArrary)解决了。
...