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();
}
}