GetBytes

Метод предоставляет приведенный к типу данных byte[] массив данных указанного поля текущей строки выборки данных. Т.к. в текущей версии ADO.NET-провайдера приведение типов не выполняется, то корректно метод может применяться только к полям с типом данных byte, varbyte, blob, иначе будет выдано исключение.

Синтаксис
public abstract long GetBytes(
    int ordinal,
    long dataOffset,
    byte[] buffer,
    int bufferOffset,
    int length
);
      

ordinal – источник данных (порядковый номер поля в текущей строке выборки данных (отсчет начинается с 0)).

dataOffset – местоположение извлекаемых данных в источнике данных (номер позиции в указанном поле текущей строки, начиная с которой должны извлекаться данные (отсчет начинается с 0)).

buffer – приемник данных (буфер в памяти для размещения извлеченных данных).

bufferOffset – местоположение данных в приемнике данных (номер позиции в приемнике данных, начиная с которой должно выполняться размещение извлеченных данных (отсчет начинается с 0)).

length – количество запрашиваемых данных в байтах.

Возвращаемое значение

Количество извлеченных байтов (может отличаться от количества запрошенных байтов, если источник данных не может их предоставить в полном объеме или достигнут конец буфера приемника).

Если значение buffer равно null, то возвращается длина запрошенного поля (независимо от заданного в нем смещения). Сами данные не предоставляются.

Исключения
InvalidCastException Невозможно преобразовать тип данных указанного столбца к типу данных byte[].
IndexOutOfRangeException Задан порядковый номер несуществующего столбца.
InvalidOperationException Не установлена текущая строка выборки данных (необходимо выполнить метод Read()).
ArgumentException Местоположение в источнике за пределами поля.
ArgumentException Местоположение в приемнике за пределами буфера.
ArgumentException Недопустимая длина.
Примеры

1)

// C#
using System;
using System.Data;
using System.Data.Common;
using System.Text;

class GetBytes
{
  static void Main()
  {
    // Создание фабрики классов провайдера
    DbProviderFactory factory =
      DbProviderFactories.GetFactory("System.Data.LinterClient");
    // Соединение с БД
    DbConnection con = factory.CreateConnection();
    con.ConnectionString =
      "Data Source=LOCAL;User ID=SYSTEM;Password=MANAGER8";
    con.Open();
    // Создание объекта DbCommand
    DbCommand cmd = factory.CreateCommand();
    cmd.Connection = con;
    // Формирование текста SQL-запроса
    cmd.CommandText =
      "Select getraw('ADO.NET-провайдер СУБД ЛИНТЕР', 18, 11)";
    // Выполнение SQL-запроса
    DbDataReader reader = cmd.ExecuteReader();
    // Обработка результатов запроса
    Byte[] value = new Byte[11];
    while (reader.Read())
    {
      reader.GetBytes(0, 0, value, 0, 11);
    }
    Console.WriteLine(Encoding.Default.GetString(value));
    // Освобождение ресурсов
    reader.Dispose();
    cmd.Dispose();
    con.Dispose();
  }
}

Результат выполнения примера:

СУБД ЛИНТЕР

2) Извлечение данных большого объема в файл.

// C#
using System;
using System.Data;
using System.Data.Common;
using System.Text;
using System.IO;

class GetBytes
{
  static void Main()
  {
    // Создание фабрики классов провайдера.
    DbProviderFactory factory =
      DbProviderFactories.GetFactory("System.Data.LinterClient");
    // Соединение с БД.
    DbConnection con = factory.CreateConnection();
    con.ConnectionString =
      "Data Source=LOCAL;User ID=SYSTEM;Password=MANAGER8";
    // Предположим что текстовые данные (рассказы) хранятся в BLOB-столбце.
    DbCommand cmd = factory.CreateCommand();
    cmd.Connection = con;
    cmd.CommandText = "SELECT publisher, story FROM biblioteka";
    // Запись извлекаемых данных в файл.
    FileStream stream;
    BinaryWriter writer;
    // Размер буфера.
    int bufferSize = 100;
    // Буфер, который будет заполнен методом GetBytes.
    byte[] outBytes = new byte[bufferSize];
    // Количество байт, полученных методом GetBytes.
    long retval;
    // Начальная позиция в буфере.
    long startIndex = 0;
    // Идентификатор издателя в имени файла.
    string pubID = "";
    // Установка соединения и получение данных в DataReader.
    con.Open();
    DbDataReader reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess);
    while (reader.Read())
    {
      // Получение идентификатора издателя.
      pubID = reader.GetString(0);
      // Создание выходного файла.
      stream = new FileStream(
        "story" + pubID + ".txt", FileMode.OpenOrCreate, FileAccess.Write);
      writer = new BinaryWriter(stream);
      // Восстановление начальной позиции.
      startIndex = 0;
      // Чтение данных в буфер.
      retval = reader.GetBytes(1, startIndex, outBytes, 0, bufferSize);
      // Продолжаем пока есть данные за пределами буфера.
      while (retval == bufferSize)
      {
        writer.Write(outBytes);
        writer.Flush();
        // Перемещаем начальный индекс в конец последнего буфера и заполняем буфер.
        startIndex += bufferSize;
        retval = reader.GetBytes(1, startIndex, outBytes, 0, bufferSize);
      }
      // Записываем в файл оставшийся буфер.
      writer.Write(outBytes, 0, (int)retval - 1);
      writer.Flush();
      // Закрываем выходной файл.
      writer.Close();
      stream.Close();
    }
    // Закрываем DataReader и соединение.
    reader.Close();
    con.Close();
  }
}