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