DataTableReader.GetChars(Int32, Int64, Char[], Int32, Int32) Метод
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Возвращает значение указанного столбца в виде массива символов.
public:
override long GetChars(int ordinal, long dataIndex, cli::array <char> ^ buffer, int bufferIndex, int length);
public override long GetChars (int ordinal, long dataIndex, char[]? buffer, int bufferIndex, int length);
public override long GetChars (int ordinal, long dataIndex, char[] buffer, int bufferIndex, int length);
override this.GetChars : int * int64 * char[] * int * int -> int64
Public Overrides Function GetChars (ordinal As Integer, dataIndex As Long, buffer As Char(), bufferIndex As Integer, length As Integer) As Long
Параметры
- ordinal
- Int32
Порядковый номер столбца (от нуля).
- dataIndex
- Int64
Индекс в поле, с которого необходимо начать считывание.
- buffer
- Char[]
Буфер, в который необходимо считать поток данных с типом char.
- bufferIndex
- Int32
Индекс в буфере, начиная с которого будут помещаться данные.
- length
- Int32
Максимальная длина для копирования в буфер.
Возвращаемое значение
Число фактически считанных символов.
Исключения
Переданный индекс находился вне диапазона от 0 до FieldCount - 1.
Предпринята попытка извлечения данных из удаленной строки.
Предпринята попытка чтения или доступа к столбцу закрытого объекта DataTableReader
.
Указанный столбец не содержит массива знаков.
Примеры
В следующем примере демонстрируется GetChars
метод. Метод TestGetChars
ожидает, что будет передан заполненный DataTableReader
двумя столбцами данных: имя файла в первом столбце и массив символов во втором. Кроме того, позволяет указать размер буфера, TestGetChars
который будет использоваться при чтении данных из массива символов в DataTableReader
. TestGetChars
создает файл, соответствующий каждой строке данных в DataTableReader
, используя предоставленные данные в первом столбце в DataTableReader
качестве имени файла.
Эта процедура демонстрирует использование GetChars
метода чтения данных, хранящихся в , DataTable
в качестве массива символов. Любой другой тип данных приводит к тому, GetChars
что метод создает исключение InvalidCastException
.
using System;
using System.Data;
using System.IO;
class Class1
{
static void Main()
{
DataTable table = new DataTable();
table.Columns.Add("FileName", typeof(string));
table.Columns.Add("Data", typeof(char[]));
table.Rows.Add(new object[] { "File1.txt", "0123456789ABCDEF".ToCharArray() });
table.Rows.Add(new object[] { "File2.txt", "0123456789ABCDEF".ToCharArray() });
DataTableReader reader = new DataTableReader(table);
TestGetChars(reader, 7);
}
private static void TestGetChars(DataTableReader reader, int bufferSize)
{
// The filename is in column 0, and the contents are in column 1.
const int FILENAME_COLUMN = 0;
const int DATA_COLUMN = 1;
char[] buffer;
long offset;
int charsRead = 0;
string fileName;
int currentBufferSize = 0;
while (reader.Read())
{
// Reinitialize the buffer size and the buffer itself.
currentBufferSize = bufferSize;
buffer = new char[bufferSize];
// For each row, write the data to the specified file.
// First, verify that the FileName column isn't null.
if (!reader.IsDBNull(FILENAME_COLUMN))
{
// Get the file name, and create a file with
// the supplied name.
fileName = reader.GetString(FILENAME_COLUMN);
// Start at the beginning.
offset = 0;
using (StreamWriter outputStream =
new StreamWriter(fileName, false))
{
try
{
// Loop through all the characters in the input field,
// incrementing the offset for the next time. If this
// pass through the loop reads characters, write them to
// the output stream.
do
{
charsRead = (int)reader.GetChars(DATA_COLUMN, offset,
buffer, 0, bufferSize);
if (charsRead > 0)
{
outputStream.Write(buffer, 0, charsRead);
offset += charsRead;
}
} while (charsRead > 0);
}
catch (Exception ex)
{
Console.WriteLine(fileName + ": " + ex.Message);
}
}
}
}
Console.WriteLine("Press Enter key to finish.");
Console.ReadLine();
}
}
Imports System.Data
Imports System.IO
Module Module1
Private Sub TestGetChars( _
ByVal reader As DataTableReader, ByVal bufferSize As Integer)
' The filename is in column 0, and the contents are in column 1.
Const FILENAME_COLUMN As Integer = 0
Const DATA_COLUMN As Integer = 1
Dim buffer() As Char
Dim offset As Integer
Dim charsRead As Integer
Dim fileName As String
Dim currentBufferSize As Integer
While reader.Read
' Reinitialize the buffer size and the buffer itself.
currentBufferSize = bufferSize
ReDim buffer(bufferSize - 1)
' For each row, write the data to the specified file.
' First, verify that the FileName column isn't null.
If Not reader.IsDBNull(FILENAME_COLUMN) Then
' Get the file name, and create a file with
' the supplied name.
fileName = reader.GetString(FILENAME_COLUMN)
' Start at the beginning.
offset = 0
Using outputStream As New StreamWriter(fileName, False)
Try
' Loop through all the characters in the input field,
' incrementing the offset for the next time. If this
' pass through the loop reads characters, write them to
' the output stream.
Do
charsRead = Cint(reader.GetChars(DATA_COLUMN, offset, _
buffer, 0, bufferSize))
If charsRead > 0 Then
outputStream.Write(buffer, 0, charsRead)
offset += charsRead
End If
Loop While charsRead > 0
Catch ex As Exception
Console.WriteLine(fileName & ": " & ex.Message)
End Try
End Using
End If
End While
Console.WriteLine("Press Enter key to finish.")
Console.ReadLine()
End Sub
Sub Main()
Dim table As New DataTable
table.Columns.Add("FileName", GetType(System.String))
table.Columns.Add("Data", GetType(System.Char()))
table.Rows.Add("File1.txt", "0123456789ABCDEF".ToCharArray)
table.Rows.Add("File2.txt", "0123456789ABCDEF".ToCharArray)
Dim reader As New DataTableReader(table)
TestGetChars(reader, 7)
End Sub
End Module
Комментарии
GetChars
возвращает количество доступных символов в поле . Большую часть времени это точная длина поля. Однако возвращенное число может быть меньше фактической длины поля, если метод GetChars
уже использовался для получения символов из поля.
Фактическое число прочитанных символов может быть меньше запрошенной длины, если достигнут конец поля. Если передать буфер, равный null (Nothing
в Visual Basic), GetChars
возвращает длину всего поля в символах, а не оставшийся размер на основе параметра смещения буфера.
Преобразования не выполняются; поэтому извлекаемые данные уже должны быть массивом символов или быть обязательными к массиву символов.