加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

sde中删除数据

(2011-07-21 20:32:05)
标签:

杂谈


                    
      因为我向SDE中导入数据,反复遇到这样的错误,根据自己解决情况,发现可能出现错误原因: 
      1.名字太长,或中间出现空格。我个人认为SDE数据对名字长度应该是有限制的,且名字中不要有空格。
      解决方法:使用新名字。
      2.删除原有数据出现错误,没有删干净。
      删除SDE中数据有多种方式,可是有的方法,似乎没有将相关的索引表删干净,导致再次导入同名数据报错失败。
      解决方法:选择更好地删除栅格数据的方法。
      

Title方式一:
        /// <summary>
        /// 删除栅格数据
        /// </summary>
        /// <param name="server"></param>
        /// <param name="instance"></param>
        /// <param name="user"></param>
        /// <param name="password"></param>
        /// <param name="database"></param>
        /// <param name="version"></param>
        /// <param name="strRasterName"></param>
        /// <returns></returns>
        public bool DeleteRasterFromGeoDatabase2(
            string server,
            string instance,
            string user,
            string password,
            string database,
            string version,
            string strRasterName)
        {
            try
            {
                ESRI.ArcGIS.DataSourcesRasterUI.IRasterSdeConnection pSDEConn;
                ESRI.ArcGIS.DataSourcesRaster.IRasterSdeStorage pSDEStorage;
                ESRI.ArcGIS.DataSourcesRaster.IRasterSdeServerOperation pSDEOp;
                ESRI.ArcGIS.Geodatabase.IWorkspaceFactory pRasterWsFact;
                ESRI.ArcGIS.DataSourcesRaster.IRasterWorkspace pRasterWS;
                ESRI.ArcGIS.Geodatabase.IGeoDataset pGeoDs; //

                //Initialize RasterSDELoader
                pSDEConn = new ESRI.ArcGIS.DataSourcesRasterUI.RasterSdeLoaderClass();
                //Make connection
                pSDEConn.ServerName = server;
                pSDEConn.Instance = instance;
                pSDEConn.Database = database;
                pSDEConn.UserName = user;
                pSDEConn.Password = password;
                pSDEConn.SdeRasterName = strRasterName;

                //Start loading
                pSDEOp = pSDEConn as ESRI.ArcGIS.DataSourcesRaster.IRasterSdeServerOperation;

                pSDEOp.Delete();
                //pSDEOp.Update();

                pSDEConn = null;
                pSDEStorage = null;
                pSDEOp = null;
                pRasterWsFact = null;
                pRasterWS = null;
                pGeoDs = null;
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message, "删除栅格数据", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                return false;
            }

            return true;
        }
方式2:
   /// <summary>
        /// 删除栅格数据
        /// </summary>
        /// <param name="server"></param>
        /// <param name="instance"></param>
        /// <param name="user"></param>
        /// <param name="password"></param>
        /// <param name="database"></param>
        /// <param name="version"></param>
        /// <param name="strLayerName"></param>
        /// <returns></returns>
        public bool DeleteRasterFromGeoDatabase(
            string server,
            string instance,
            string user,
            string password,
            string database,
            string version,
            string strLayerName)
        {
            try
            {
                ESRI.ArcGIS.Geodatabase.IWorkspaceFactory pWorkspaceFactory;
                ESRI.ArcGIS.Geodatabase.IRasterWorkspaceEx pRasterWorkspaceEx;
                ESRI.ArcGIS.esriSystem.IPropertySet pPropertySet;

                //Create SDE workspace factory
                pWorkspaceFactory = new ESRI.ArcGIS.DataSourcesGDB.SdeWorkspaceFactoryClass();
                pPropertySet = new ESRI.ArcGIS.esriSystem.PropertySetClass();
                pPropertySet.SetProperty("SERVER", server);
                pPropertySet.SetProperty("INSTANCE", instance);
                pPropertySet.SetProperty("DATABASE", database);
                pPropertySet.SetProperty("USER", user);
                pPropertySet.SetProperty("PASSWORD", password);
                pPropertySet.SetProperty("VERSION", version);
                pRasterWorkspaceEx = pWorkspaceFactory.Open(pPropertySet, 0) as ESRI.ArcGIS.Geodatabase.IRasterWorkspaceEx;

                //pRasterWorkspaceEx.DeleteRasterDataset(strLayerName);
                string strFullLayerName = user.ToUpper() + "." + strLayerName;               
                pRasterWorkspaceEx.DeleteRasterDataset(strFullLayerName);

                ////Delete the existing raster if it exists in the database
                //ESRI.ArcGIS.Geodatabase.IDataset pDataset;
                //pDataset = pRasterWorkspaceEx.OpenRasterDataset(strLayerName) as ESRI.ArcGIS.Geodatabase.IDataset;
                //if (pDataset != null) //删除栅格图层
                //{                  
                //    pDataset.Delete();
                //}
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "删除栅格数据", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                return false;
            }

            return true;
        }

 

      3.与现有栅格数据重名
      解决方法:a 修改自动生成名称的方式,防止出现重名现象;b 检查名称是否有效; c 删除或覆盖已有名称的sde栅格数据。
     自动产生名字的好方法:
      

/// 通遗址编码来获得新的影像名称
        /// </summary>
        /// <param name="pstrCode"></param>
        /// <returns></returns>
        private string GetNewImageNameByCode(string pstrCode)
        {
            //文件名
            string strImageName="";
            //检查数据库连接
            bool bCon = DataOpr.OpenOracleCon();
            if (!bCon)
            {
                MessageBox.Show("请检查数据库连接!", "数据操作信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return "";
            }
            //查询已有名称
            string strSQL = "SELECT * FROM 自己的表名 WHERE CODE='" + pstrCode + "'";
            DataSet ds = DataOpr.Query(strSQL);
            int iCount=ds.Tables[0].Rows.Count ;
            if (iCount== 0) //不存在该编码记录
            {
                strImageName = pstrCode + "_1";
                return strImageName;
            }
            else 
            {
                //产生新的名称, (修改个错误,j可以等于0 
                for (int j =iCount; j>=0 ; j--)
                {
                    int count=j+1;
                    //新影像名称
                    strImageName = pstrCode +"_"+ count.ToString();
                    bool bExist = IsExistImagesName(ds, strImageName);
                    if (bExist) //如果新航片名不存在,可以使用
                    {
                        break; //跳出循环
                    }
                }
            }
            //返回新的文件名
            return strImageName;
        }

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有