На первый взгляд моя проблема кажется довольно тривиальной. Мне нужно прочитать данные из базы данных Firebird, но эта база данных была создана кем-то другим. Необработанные двоичные данные (например, изображения) хранятся в BLOB SUB_TYPE TEXT вместо BLOB SUB_TYPE BINARY, и это проблема, потому что Firebird ADO.NET Data Provider ( FirebirdSql.Data. FirebirdClient 7.10.1 ) преобразует двоичные данные в строку, и я не могу найти подходящий метод в этом драйвере, который возвращает двоичные данные в виде массива байтов из BLOB SUB_TYPE TEXT.

Я пытался отменить двоичные данные, преобразованные в строку поставщиком, но безуспешно. Я использую этого провайдера следующим образом (упрощенный пример):

using var fbConnection = new FbConnection(connectionString);
fbConnection.Open();
var readCommand = new FbCommand(command, fbConnection);
var reader = readCommand.ExecuteReader();

while (reader.Read())
{
    // reader[0] contains data from column with BLOB SUB_TYPE TEXT type
    var rawData = Encoding.Default.GetBytes(reader[0].ToString());
    // ...
}

Согласно этому сообщению, такое преобразование невозможно: https://stackoverflow.com/a/14168060/1281652

Теоретически здесь описан один из обходных путей: https://stackoverflow.com/a/24821965 но я не могу изменить эту базу данных, поэтому в моем случае это не применимо.

Как я могу правильно прочитать эти данные в c #?

1
rgb 12 Фев 2021 в 19:29

1 ответ

Лучший ответ

Как указано в комментариях Charlieface, вы можете использовать reader.GetBytes.

В качестве альтернативы вы можете заставить Firebird представлять тип как двоичный, явно приведя его:

cast(yourfield as BLOB SUB_TYPE BINARY)

Преобразования из любого подтипа больших двоичных объектов в двоичные приведут к необработанным двоичным данным, если только фильтр больших двоичных объектов не был определен для применения другого преобразования.

1
Mark Rotteveel 12 Фев 2021 в 19:17