方法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;
}