Necesito leer un campo blob de una base de datos en una aplicación C#.Cómo leer una matriz Delphi de cadenas de tamaño fijo dentro de un registro empaquetado en C#
Sin embargo el campo blob se escriben en la base de datos por una aplicación Delphi usando el siguiente método:
procedure WriteABlob(Blob : TBlobField; var Buffer; size : integer);
var
s : String;
begin
setlength(s,size);
move(buffer,s[1],Size);
Blob.Value := S;
end;
La Estructura escrito a la base de datos no es una estructura simple y contiene cosas como
MyVariable : Array[0..3] of String[80];
o peor algunos de ellos contienen
MyRecord = Packed Record
case byte of
1: (
iValue:Integer;
)
2: (
cValue:Char;
)
end;
He estado intentando r eading en los bytes de la base de datos y luego usando
Marshal.PtrToStructure()
a fin de avanzar en la estructura
Mi Struct se define de la siguiente manera:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1, Size = 10710)]
public struct MyBlobField
{
...
[MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.AnsiBStr,SizeConst = SpecificArraySize)]
public String[] ArrayofFixedLengthStrings;
...
}
pero me da un error al llamar Marshal.PtrToStructure():
no se puede Mariscal de campo '' ArrayofFixedLengthStrings de tipo 'MyBlobField': no válido combinación de tipo administrado/no administrado (String [] debe estar emparejado con un ArraySubType de LPStr, LPWStr, BStr o LPTStr).
Me preguntaba si había un atributo que pudiera definir en un CustomMarshaler que aceptar un emparejamiento con un String []
¿Alguna idea de cómo podría leer el contenido de la burbuja en C#?
¿Es realmente un AnsiBstr y no un Bstr (es decir Unicode) regular. Eso es bastante no estándar. –
Versiones anteriores de Delphi (incluido D2007) estandarizadas en Ansi en lugar de Unicode. –