Я должен считать поле блоба из базы данных в c# приложение.
Однако поле блоба было записано в базу данных Приложением Delphi с помощью следующего метода:
procedure WriteABlob(Blob : TBlobField; var Buffer; size : integer);
var
s : String;
begin
setlength(s,size);
move(buffer,s[1],Size);
Blob.Value := S;
end;
Структура, записанная в базу данных, не является простой структурой и содержит вещи как
MyVariable : Array[0..3] of String[80];
или хуже некоторые из них содержат
MyRecord = Packed Record
case byte of
1: (
iValue:Integer;
)
2: (
cValue:Char;
)
end;
Я пытался читать в байтах из базы данных и затем использования
Marshal.PtrToStructure()
для перемещения его в структуру
Моя Структура определяется следующим образом:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1, Size = 10710)]
public struct MyBlobField
{
...
[MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.AnsiBStr,SizeConst = SpecificArraySize)]
public String[] ArrayofFixedLengthStrings;
...
}
Но я получаю ошибку при вызове Маршала. PtrToStructure ():
Не может упорядочить поле 'ArrayofFixedLengthStrings' типа 'MyBlobField': Недопустимая управляемая/неуправляемая комбинация типа (Строка [] должна быть соединена с ArraySubType LPStr, LPWStr, BStr или LPTStr).
Я задавался вопросом, был ли атрибут, я мог бы определить на CustomMarshaler, который принял бы соединение со Строкой []
Какие-либо идеи, как я мог считать содержание блоба в c#?
Разобрался ...
Объявлена структура String20 как
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public struct String20
{
[MarshalAs(UnmanagedType.U1)]
public byte StringSize;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
public String Value;
}
По-видимому, идентификатор размера строки в начале строки фиксированной длины (например, delphi ShortString) составляет всего 1 байт. Затем определение header_identifiers было изменено на:
[MarshalAs(UnmanagedType.ByValArray, SizeConst = max_header_identifiers)]
public String20[] header_identifiers;
Также обнаружено, что Delphi Packed Boolean необходимо преобразовать как
[MarshalAs(UnmanagedType.I1)]
public bool BooleanVar;
Вот как получить синтаксис декоратора Jerub упомянул
def timeout(limit=None):
if limit is None:
limit = DEFAULT_TIMEOUT
if limit <= 0:
raise TimeoutError() # why not ValueError here?
def wrap(function):
return _Timeout(function,limit)
return wrap
@timeout(15)
def mymethod(): pass
-121--1540324- Это не совсем так, как он работает, tr: first-child ol
выбирает tr , который является первым нижестоящим элементом его родительского элемента. Вместо этого необходимо использовать псевдокласс first-child
в td
.
Мой первый комментарий заключается в том, что «String [80]» является последовательностью фиксированной длины (которая должна быть проще в структуре), и в C # вы пытаетесь поместить ее в «String []» - которая фактически является ссылкой (указателем) на последовательность.
Мой следующий комментарий заключается в том, что в худшем случае вы можете попробовать прочесть его в массив байтов и вытащить нужные вам байты и манипулировать ими в структуру назначения.