我有一个由MSSQL数据库支持的GIS层。例如,图层上的要素有一个类型为esriFieldTypeString的字段和一个类型为esriFieldTypeBlob的字段。我可以编辑字符串字段,但是,当我尝试编辑blob时,StopEditOperation()抛出一个非常通用的异常(消息:“错误HRESULT E_FAIL已从调用COM组件返回。”,错误代码: -2147467259)。我在服务器日志中找不到任何相关内容。有谁知道发生了什么事?
IServerContext serverContext = GetServerContext(agsConn, serviceName);
ILayer layer = GetILayer(layerName, serverContext);
IWorkspace workspace = GetIWorkspace(layer);
var feature = GetIFeature(objectId, workspace, layer);
var workspaceEdit = (IWorkspaceEdit)workspace;
workspaceEdit.StartEditing(false);
workspaceEdit.StartEditOperation();
var index = feature.Fields.FindField(featureDetailName);
IField field = feature.Fields.get_Field(index);
byte[] byteArray = {1, 2, 3};
MemoryBlobStream blob = new MemoryBlobStream();
((IMemoryBlobStreamVariant)blob).ImportFromVariant(byteArray);
if (field.CheckValue(blob))
{
feature.set_Value(index, blob);
}
feature.Store();
workspaceEdit.StopEditOperation();
workspaceEdit.StopEditing(true);
serverContext.RemoveAll();
serverContext.ReleaseContext();
答案 0 :(得分:1)
首先,您可能很有可能在ESRI论坛上获得更好的反馈,因为您的问题非常具体。
我似乎记得我和BLOB有类似的问题,只读它们,不写信给他们。在我的情况下,我使用回收光标来检索功能引用,使用非回收光标解决它。我认为这不是您的情况,因为您正在执行编辑,这需要您使用非回收游标。或者您可能直接从图层中获取对您的特征的引用,这根本不涉及游标。
你使用MemoryBlobStream的ImportFromVariant的方式很好,我没有看到任何问题。我首先测试在个人或文件地理数据库中编辑blob时是否会出现同样的问题。
答案 1 :(得分:1)
尝试从编辑会话中获取该功能。
var workspaceEdit = (IWorkspaceEdit)workspace;
workspaceEdit.StartEditing(false);
workspaceEdit.StartEditOperation();
var feature = GetIFeature(objectId, workspace, layer);
来自http://edndoc.esri.com/arcobjects/9.1/ComponentHelp/esriGeoDatabase/IWorkspaceEdit.htm
放弃对在编辑会话边界检索的行对象的所有引用(在StartEditing上)。如果在编辑操作中保持对行对象的引用,则丢弃所有引用并重新获取对象..
同时尝试结尾处的建议: