The following example shows different methods for insert binary data to Virtuoso RDF storage in plain queries and with parameter binding via ADO.NET calls.
# Test_Bin.cs
using System;
using System.Runtime.InteropServices;
using System.Text;
using System.Data;
using OpenLink.Data.Virtuoso;
#if ODBC_CLIENT
namespace OpenLink.Data.VirtuosoOdbcClient
#elif CLIENT
namespace OpenLink.Data.VirtuosoClient
#else
namespace OpenLink.Data.VirtuosoTest
#endif
{
class Test_Bin
{
[STAThread]
static void Main(string[] args)
{
IDataReader myread = null;
IDbConnection c;
c = new VirtuosoConnection("HOST=localhost:1111;UID=dba;PWD=dba;");
IDbCommand cmd = c.CreateCommand();
int ros;
try
{
c.Open();
cmd.CommandText = "sparql clear graph <ado.bin>";
cmd.ExecuteNonQuery();
//insert binary as base64Binary
cmd.CommandText = "sparql insert into graph <ado.bin> { <res1> <attr> \"GpM7\"^^<http://www.w3.org/2001/XMLSchema#base64Binary> }";
cmd.ExecuteNonQuery();
//insert binary as hexBinary
cmd.CommandText = "sparql insert into graph <ado.bin> { <res2> <attr> \"0FB7\"^^<http://www.w3.org/2001/XMLSchema#hexBinary> }";
cmd.ExecuteNonQuery();
//prepare for insert with parameter binding
cmd.CommandText = "sparql define output:format '_JAVA_' insert into graph <ado.bin> { `iri($?)` <attr> `bif:__rdf_long_from_batch_params($?,$?,$?)` }";
//bind parameters for insert binary as base64Binary
IDbDataParameter param = cmd.CreateParameter();
param.ParameterName = "p1";
param.DbType = DbType.AnsiString;
param.Value = "res3";
cmd.Parameters.Add(param);
param = cmd.CreateParameter();
param.ParameterName = "p2";
param.DbType = DbType.Int32;
param.Value = 4;
cmd.Parameters.Add(param);
param = cmd.CreateParameter();
param.ParameterName = "p3";
param.DbType = DbType.AnsiString;
param.Value = "GpM7";
cmd.Parameters.Add(param);
param = cmd.CreateParameter();
param.ParameterName = "p4";
param.DbType = DbType.AnsiString;
param.Value = "http://www.w3.org/2001/XMLSchema#base64Binary";
cmd.Parameters.Add(param);
cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
//bind parameters for insert binary as hexBinary
param = cmd.CreateParameter();
param.ParameterName = "p1";
param.DbType = DbType.AnsiString;
param.Value = "res4";
cmd.Parameters.Add(param);
param = cmd.CreateParameter();
param.ParameterName = "p2";
param.DbType = DbType.Int32;
param.Value = 4;
cmd.Parameters.Add(param);
param = cmd.CreateParameter();
param.ParameterName = "p3";
param.DbType = DbType.AnsiString;
param.Value = "0FB7";
cmd.Parameters.Add(param);
param = cmd.CreateParameter();
param.ParameterName = "p4";
param.DbType = DbType.AnsiString;
param.Value = "http://www.w3.org/2001/XMLSchema#hexBinary";
cmd.Parameters.Add(param);
cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
//bind parameters for insert binary as byte[]
param = cmd.CreateParameter();
param.ParameterName = "p1";
param.DbType = DbType.AnsiString;
param.Value = "res5";
cmd.Parameters.Add(param);
param = cmd.CreateParameter();
param.ParameterName = "p2";
param.DbType = DbType.Int32;
param.Value = 3;
cmd.Parameters.Add(param);
param = cmd.CreateParameter();
param.ParameterName = "p3";
param.DbType = DbType.Binary;
byte[] bin_val = {0x01, 0x02, 0x03, 0x04, 0x05};
param.Value = bin_val;
cmd.Parameters.Add(param);
param = cmd.CreateParameter();
param.ParameterName = "p4";
param.DbType = DbType.AnsiString;
param.Value = System.DBNull.Value;
cmd.Parameters.Add(param);
cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
//execute select and check the results
cmd.CommandText = "sparql SELECT ?s ?o FROM <ado.bin> WHERE {?s ?p ?o}"; ;
myread = cmd.ExecuteReader();
int r = 0;
while (myread.Read())
{
Console.WriteLine("=== ROW === "+r);
for (int i = 0; i < myread.FieldCount; i++)
{
string s;
if (myread.IsDBNull(i))
Console.Write("N/A|\n");
else
{
object o = myread.GetValue(i);
Type t = myread.GetFieldType(i);
s = myread.GetString(i);
Console.Write(s + "[");
if (o is SqlExtendedString)
{
SqlExtendedString se = (SqlExtendedString)o;
Console.Write("IriType=" + se.IriType + ";StrType=" + se.StrType + ";Value=" + se.ToString());
Console.Write(";ObjectType=" + o.GetType() + "]|\n");
}
else if (o is SqlRdfBox)
{
SqlRdfBox se = (SqlRdfBox)o;
Console.Write("Lang=" + se.StrLang + ";Type=" + se.StrType + ";Value=" + se.Value);
Console.Write(";ObjectType=" + o.GetType() + "]|\n");
object v = se.Value;
if (v is System.Byte[])
{
byte[] vb = (byte[])v;
for (int z = 0; z < vb.Length; z++)
{
Console.WriteLine(""+z+"="+vb[z]);
}
}
}
else
Console.Write(o.GetType() + "]|\n");
}
}
r++;
}
}
catch (Exception e)
{
Console.WriteLine("{0} Exception caught.", e);
}
finally
{
// if (myread != null)
// myread.Close();
if (c.State == ConnectionState.Open)
c.Close();
}
}
}
}
Output log for example is in the log.txt:
# log.txt === ROW === 0 res1[IriType=IRI;StrType=IRI;Value=res1;ObjectType=OpenLink.Data.Virtuoso.SqlExtendedString]| GpM7[Lang=;Type=http://www.w3.org/2001/XMLSchema#base64Binary;Value=GpM7;ObjectType=OpenLink.Data.Virtuoso.SqlRdfBox]| === ROW === 1 res2[IriType=IRI;StrType=IRI;Value=res2;ObjectType=OpenLink.Data.Virtuoso.SqlExtendedString]| 0FB7[Lang=;Type=http://www.w3.org/2001/XMLSchema#hexBinary;Value=0FB7;ObjectType=OpenLink.Data.Virtuoso.SqlRdfBox]| === ROW === 2 res3[IriType=IRI;StrType=IRI;Value=res3;ObjectType=OpenLink.Data.Virtuoso.SqlExtendedString]| GpM7[Lang=;Type=http://www.w3.org/2001/XMLSchema#base64Binary;Value=GpM7;ObjectType=OpenLink.Data.Virtuoso.SqlRdfBox]| === ROW === 3 res4[IriType=IRI;StrType=IRI;Value=res4;ObjectType=OpenLink.Data.Virtuoso.SqlExtendedString]| 0FB7[Lang=;Type=http://www.w3.org/2001/XMLSchema#hexBinary;Value=0FB7;ObjectType=OpenLink.Data.Virtuoso.SqlRdfBox]| === ROW === 4 res5[IriType=IRI;StrType=IRI;Value=res5;ObjectType=OpenLink.Data.Virtuoso.SqlExtendedString]| 0102030405[System.Byte[]]|