RowCursor / BLOB

870
7
01-13-2017 04:41 AM
LaurentiuIchim2
New Contributor II

Hello for all,

I have a Standalone Table with Binary Large Object (BLOB) field. Into BLOB field of the Table are various documents (Image, Excel Document PDF Document and so on).

I need to programmatically get this document and work it using Row Cursor.

How can I get the MemoryStream from the Row object?

Thank you in advance,

Laurentiu

0 Kudos
7 Replies
MaxMax2
Occasional Contributor II

Hi Laurentiu,

Values of BLOB fields are returned as COM objects now, so it seems that support of BLOBs editing is not implemented in current version (1.4) of the ArcGIS Pro SDK. I hope ESRI team working on ArcGIS Pro SDK will pay attention to this bug.

Max

0 Kudos
SreevatsaSreeraman
New Contributor II

Hi Laurentiu,

As Max suggested, we don't have support for reading and editing BLOB fields yet. It has been scheduled for the next release.

As a workaround, could attachments be used to store binary data? We have support to store binary data by assigning MemoryStreams or obtaining MemoryStreams from the Attachement table. Please refer to How to create a memory stream  and Adding Attachments for more information.

-Sree

0 Kudos
GintautasKmieliauskas
Regular Contributor

Hi Sreevatsa,

Do you have information about supporting reading and writing BLOB fields in ArcGIS Pro 2.3?

0 Kudos
SeanJones
Esri Regular Contributor

You can now do this with either the Inspector class within an EditOperation:

      //Run on MCT
QueuedTask.Run(() =>
{
//get selected feature into inspector
var selectedFeatures = MapView.Active.Map.GetSelection();
var insp = new Inspector();
insp.Load(selectedFeatures.Keys.First(), selectedFeatures.Values.First());

//read file into memory stream
var msr = new MemoryStream();
using (FileStream file = new FileStream(@"d:\me\images\Hydrant.jpg", FileMode.Open, FileAccess.Read))
{
file.CopyTo(msr);
}

//put the memory stream in the blob field
var op = new EditOperation();
op.Name = "Blob Inspector";
insp["Image"] = msr;
//insp.ApplyAsync();
op.Modify(insp);
op.Execute();

//read blob field and save to a file
//assume inspector has been loaded with a feature
var msw = new MemoryStream();
msw = insp["Image"] as MemoryStream;
using (FileStream file = new FileStream(@"d:\temp\blob.jpg", FileMode.Create, FileAccess.Write))
{
msw.WriteTo(file);
}
});

or with the row object in a rowcursor:

      QueuedTask.Run(() =>
{
var editOp = new EditOperation();
editOp.Name = "Blob Cursor";
var featLayer1 = MapView.Active.Map.FindLayers("Hydrant").First() as FeatureLayer;

editOp.Callback((context) => {
using (var rc = featLayer1.GetTable().Search(null, false))
{
while (rc.MoveNext())
{
//context.Invalidate(rc.Current);
//read file into memory stream
var msr = new MemoryStream();
using (FileStream file = new FileStream(@"d:\me\images\Hydrant.jpg", FileMode.Open, FileAccess.Read))
{
file.CopyTo(msr);
}

rc.Current["Image"] = msr;
rc.Current.Store();

//read the blob field to a file
var msw = new MemoryStream();
msw = rc.Current["Image"] as MemoryStream;
using (FileStream file = new FileStream(@"d:\temp\blob.jpg", FileMode.Create, FileAccess.Write))
{
msw.WriteTo(file);
}

//context.Invalidate(rc.Current);
}
}

}, featLayer1.GetTable()); //Pass as parameters the datasets
editOp.Execute();
});
0 Kudos
GintautasKmieliauskas
Regular Contributor

Thank you Sean.

I would be nice to see that information in Snippets and API reference

0 Kudos
GintautasKmieliauskas
Regular Contributor

Hi Sean,

One more question. Is it possible to read/write from/to Raster type field? If yes- how?

0 Kudos
SeanJones
Esri Regular Contributor

I'll get that snippet in for blobs.

The raster field isn't supported in the same way currently. Its on the list.

0 Kudos