Sdílet prostřednictvím


DataTableReader.GetChars(Int32, Int64, Char[], Int32, Int32) Metoda

Definice

Vrátí hodnotu zadaného sloupce jako pole znaků.

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

Parametry

ordinal
Int32

Řadový sloupec založený na nule.

dataIndex
Int64

Index v poli, ze kterého se má spustit operace čtení.

buffer
Char[]

Vyrovnávací paměť, do které se má číst stream znaků.

bufferIndex
Int32

Index v rámci vyrovnávací paměti, do kterého chcete začít umísťovat data.

length
Int32

Maximální délka kopírování do vyrovnávací paměti.

Návraty

Skutečný počet přečtených znaků.

Výjimky

Předaný index byl mimo rozsah 0 až FieldCount 1.

Došlo k pokusu o načtení dat z odstraněného řádku.

Došlo k pokusu o čtení nebo přístup ke sloupci v uzavřeném DataTableReaderobjektu .

Zadaný sloupec neobsahuje pole znaků.

Příklady

Následující příklad ukazuje metodu GetChars . Metoda TestGetChars očekává DataTableReader předání se dvěma sloupci dat: názvem souboru v prvním sloupci a polem znaků ve druhém. Kromě toho můžete určit velikost vyrovnávací paměti, TestGetChars která se má použít při čtení dat z pole znaků v DataTableReader. TestGetChars vytvoří soubor odpovídající každému řádku dat v DataTableReadersouboru pomocí zadaných dat v prvním sloupci DataTableReader jako názvu souboru.

Tento postup ukazuje použití GetChars metody čtení dat, která byla uložena v DataTable poli znaků. Jakýkoli jiný typ dat způsobí, že GetChars metoda vyvolá .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

Poznámky

GetChars vrátí počet dostupných znaků v poli. Většinou se jedná o přesnou délku pole. Vrácené číslo však může být menší než skutečná délka pole, pokud GetChars již bylo použito k získání znaků z pole.

Skutečný počet přečtených znaků může být menší než požadovaná délka, pokud je dosaženo konce pole. Pokud předáte vyrovnávací paměť, která má hodnotu null (Nothing v jazyce Visual Basic), GetChars vrátí délku celého pole ve znacích, nikoli zbývající velikost na základě parametru posunu vyrovnávací paměti.

Nejsou provedeny žádné převody; Proto data, která se mají načíst, již musí být pole znaků nebo musí být vyměněná k matici znaků.

Platí pro