2

我有一个由 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();
4

2 回答 2

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 上)检索到的行对象的所有引用。如果将在编辑操作中维护对行对象的引用,则丢弃所有引用并重新获取对象。

也可以试试最后的建议:

http://forums.esri.com/Thread.asp?c=158&f=2281&t=241561

于 2010-03-18T13:18:34.027 回答
1

首先,您很可能在 ESRI 论坛上获得更好的反馈,因为您的问题非常具体。

我似乎记得我对 BLOB 也有类似的问题,只读取它们,而不是写给它们。在我的情况下,我使用回收游标来检索功能引用,使用非回收游标解决了它。我认为这不是您的情况,因为您正在执行编辑,这需要您使用非循环光标。或者您可能直接从图层中获取对您的功能的引用,这根本不涉及您的光标。

您使用 MemoryBlobStream 的 ImportFromVariant 的方式很好,我看不出有任何问题。我将首先测试在个人或文件地理数据库中编辑 blob 时是否会出现相同的问题。

于 2009-11-05T16:04:58.087 回答