使用Geoprocessor导出ArcSde中的数据,对COM 组件的调用返回了错误 HRESULT E_FAIL 的解决方法

时间:2022-04-12 14:31:53

方法exportSDE在VS中调试没有问题,发布到IIS后,则报错误:对COM 组件的调用返回了错误 HRESULT E_FAIL 。

google后发现解决问题的方法千篇一律,没一个管用的。

后来在http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=69628 处搜索到一问题,随试了一下创建临时连接文件,得以解决。

 


 

 

 

此处为报错的代码:

 

 

protected void Page_Load(object sender, EventArgs e)

    {

        exportSDE(@"Database Connections/Connection to WIN-5B53I9JIQQ5.sde/sde.SDE.sss120038njs", @"D:/dem/sss120038njs.img");

    }

 

 

    /// <summary>

    /// ArcSde数据库中导出Img栅格数据

    /// </summary>

    /// <param name="strInRaseterName">ArcSde数据库目标数据文件</param>

    /// <param name="strOutRasterPath">服务器上导出后的全路径</param>

    public static void exportSDE(string strInRaseterName, string strOutRasterPath)

    {

 

        try

        {

            //License初始化,如不初始化,open时会报错

            IAoInitialize m_AoInitialize = new AoInitialize();

            m_AoInitialize.Initialize(esriLicenseProductCode.esriLicenseProductCodeEngine);

 

            IVariantArray parameters = new VarArrayClass();

            //Set in_raster.

            parameters.Add(strInRaseterName);

            //Set out_rasterdataset.

            parameters.Add(strOutRasterPath);

 

            //Set geoprocessor for execution.

            Geoprocessor geoprocessor = new Geoprocessor();

            geoprocessor.OverwriteOutput = true;

            geoprocessor.Execute("CopyRaster", parameters, null);

             

        }

        catch (Exception ex)

        {

            throw ex;

        }

 

    }

 

 

 

 


此处为修改后的代码(不要忘记给相应的文件夹加权限):

 

protected void Button1_Click(object sender, EventArgs e)

    {

        string strTempPath = @"d:/dem";//d:/dem换成项目里下载的路径

        string strTempName = @"temp.sde";//连接Sde数据库的临时文件名

        string strAllPath = strTempPath + "//" + strTempName;//连接Sde数据库的临时文件存放的全路径

        if (File.Exists(strAllPath))

        {

            File.Delete(strAllPath);

        }

        IWorkspaceFactory m_pWorkspaceFactory =new SdeWorkspaceFactoryClass();

        IWorkspaceName wsn = m_pWorkspaceFactory.Create(strTempPath, strTempName, ConnectSDE(true), 0);//首先创建一个sde链接文件

 

 

        exportSDE(strAllPath + @"/sde.SDE.N120038NJS6", @"D:/dem/sss120038njs.img");

        Response.Write("OK");

    }

 

 

    /// <summary>

    /// 设置SDE连接属性

    /// </summary>

    /// <param name="ChkSdeLinkModle"></param>

    /// <returns>IPropertySet</returns>

    public static IPropertySet ConnectSDE(bool ChkSdeLinkModle)

    {

        //定义一个属性

        IPropertySet Propset = new PropertySetClass();

        if (ChkSdeLinkModle == true) // 采用SDE连接

        {

            //设置数据库服务器名

            Propset.SetProperty("SERVER", "GGG-927BCAE0082");

            //设置SDE的端口,这是安装时指定的,默认安装时"port:5151"

            Propset.SetProperty("INSTANCE", "port:5151");

            //SDE的用户名

            Propset.SetProperty("USER", "sde");

            //密码

            Propset.SetProperty("PASSWORD", "sde");

            //设置数据库的名字,只有SQL Server  Informix 数据库才需要设置

            Propset.SetProperty("DATABASE", "sde");

            //SDE的版本,在这为默认版本

            Propset.SetProperty("VERSION", "SDE.DEFAULT");

        }

        else // 直接连接

        {

            //设置数据库服务器名,如果是本机可以用"sde:sqlserver:.",直接连接会弹出选择数据库对话框,要求填入用户名密码

            Propset.SetProperty("INSTANCE", "sde:sqlserver:xxsde");

        }

 

        return Propset;

 

    }