您的位置:首页 > 大数据 > 人工智能

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

2011-06-10 16:37 841 查看
方法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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐