Bagikan melalui


Mengambil data oleh DataReader

Berlaku untuk: .NET Framework .NET .NET Standard

Mengunduh ADO.NET

Untuk mengambil data menggunakan DataReader, buat instans objek Perintah, lalu buat DataReader dengan memanggil Command.ExecuteReader ke mengambil baris dari sumber data. DataReader menyediakan aliran data yang tidak di-buffer yang memungkinkan logika prosedural memproses hasil secara efisien dari sumber data secara berurutan.

Catatan

DataReader adalah pilihan yang baik saat Anda mengambil data dalam jumlah besar karena data tidak disimpan dalam cache di memori.

Contoh berikut mengilustrasikan penggunaan DataReader, di mana reader mewakili DataReader yang valid dan command mewakili objek Perintah yang valid.

reader = command.ExecuteReader();  

Gunakan metode DataReader.Read untuk mendapatkan baris dari hasil kueri. Anda dapat mengakses setiap kolom dari baris yang dikembalikan dengan meneruskan nama atau nomor urut kolom ke DataReader. Namun, untuk mendapatkan performa terbaik, DataReader menyediakan serangkaian metode yang memungkinkan Anda mengakses nilai kolom dalam jenis data aslinya (GetDateTime, GetDouble, GetGuid, GetInt32, dan seterusnya). Untuk daftar metode aksesor yang ditik untuk DataReaders khusus penyedia data, lihat SqlDataReader. Menggunakan metode pengakses yang diketik saat Anda mengetahui jenis data yang mendasarinya mengurangi jumlah konversi jenis yang diperlukan saat mengambil nilai kolom.

Contoh berikut mengulangi melalui objek DataReader dan mengembalikan dua kolom dari setiap baris.

static void HasRows(SqlConnection connection)
{
    using (connection)
    {
        SqlCommand command = new SqlCommand(
          "SELECT CategoryID, CategoryName FROM Categories;",
          connection);
        connection.Open();

        SqlDataReader reader = command.ExecuteReader();

        // Check if the DataReader has any row.
        if (reader.HasRows)
        {
            // Obtain a row from the query result.
            while (reader.Read())
            {
                Console.WriteLine("{0}\t{1}", reader.GetInt32(0),
                    reader.GetString(1));
            }
        }
        else
        {
            Console.WriteLine("No rows found.");
        }
        // Always call the Close method when you have finished using the DataReader object.
        reader.Close();
    }
}

Tutup DataReader

Selalu panggil Close() metode ketika Anda telah selesai menggunakan DataReader objek .

Catatan

Jika Perintah Anda berisi parameter output atau nilai kembalian, nilai tersebut tidak tersedia hingga DataReader ditutup.

Penting

Saat DataReader terbuka, Koneksi digunakan secara eksklusif oleh DataReader tersebut. Anda tidak dapat menjalankan perintah apa pun untuk Koneksi, termasuk membuat DataReader lain, hingga DataReader asli ditutup.

Catatan

Jangan panggil Tutup atau Buang pada Koneksi, DataReader, atau objek terkelola lainnya di metode Selesaikan kelas Anda. Di penyelesai, hanya merilis sumber daya yang tidak dikelola yang kelas Anda miliki secara langsung. Jika kelas Anda tidak memiliki sumber daya yang tidak dikelola, jangan sertakan metode Selesaikan dalam definisi kelas Anda. Untuk informasi selengkapnya, lihat Pengumpulan Sampah.

Mengambil beberapa tataan hasil menggunakan NextResult

Jika DataReader mengembalikan beberapa kumpulan hasil, panggil metode NextResult untuk mengulangi kumpulan hasil secara berurutan. Contoh berikut menunjukkan SqlDataReader memproses hasil dua pernyataan SELECT menggunakan metode ExecuteReader.

static void RetrieveMultipleResults(SqlConnection connection)
{
    using (connection)
    {
        SqlCommand command = new SqlCommand(
          "SELECT CategoryID, CategoryName FROM dbo.Categories;" +
          "SELECT EmployeeID, LastName FROM dbo.Employees",
          connection);
        connection.Open();

        SqlDataReader reader = command.ExecuteReader();

        // Check if the DataReader has any row.
        while (reader.HasRows)
        {
            Console.WriteLine("\t{0}\t{1}", reader.GetName(0),
                reader.GetName(1));

            // Obtain a row from the query result.
            while (reader.Read())
            {
                Console.WriteLine("\t{0}\t{1}", reader.GetInt32(0),
                    reader.GetString(1));
            }

            // Hop to the next result-set.
            reader.NextResult();
        }
        // Always call the Close method when you have finished using the DataReader object.
        reader.Close();
    }
}

Mendapatkan informasi skema dari DataReader

Saat DataReader terbuka, Anda dapat mengambil informasi skema tentang kumpulan hasil saat ini menggunakan metode GetSchemaTable. GetSchemaTable mengembalikan objek DataTable yang diisi dengan baris dan kolom yang berisi informasi skema untuk kumpulan hasil saat ini. DataTable berisi satu baris untuk setiap kolom kumpulan hasil. Setiap kolom tabel skema dipetakan ke properti kolom yang dikembalikan dalam baris kumpulan hasil, di mana ColumnName adalah nama properti dan nilai kolom adalah nilai properti. Contoh berikut menuliskan informasi skema untuk DataReader.

static void GetSchemaInfo(SqlConnection connection)
{
    using (connection)
    {
        SqlCommand command = new SqlCommand(
          "SELECT CategoryID, CategoryName FROM Categories;",
          connection);
        connection.Open();

        SqlDataReader reader = command.ExecuteReader();

        // Retrieve schema information about the current result-set.
        DataTable schemaTable = reader.GetSchemaTable();

        foreach (DataRow row in schemaTable.Rows)
        {
            foreach (DataColumn column in schemaTable.Columns)
            {
                Console.WriteLine(String.Format("{0} = {1}",
                   column.ColumnName, row[column]));
            }
        }

        // Always call the Close method when you have finished using the DataReader object.
        reader.Close();
    }
}

Lihat juga