Mengambil data dari database pada C#

Pada bagian ini, kita akan menggunakan database yang sama dengan bagian sebelumnya yang dapat dibuat dengan query berikut:

#Buat database
CREATE DATABASE IF NOT EXISTS kampus;

#Aktifkan database
USE kampus;

#Buat tabel
CREATE TABLE IF NOT EXISTS mahasiswa (
    id INT PRIMARY KEY AUTO_INCREMENT,
    namalengkap VARCHAR(100),
    gender VARCHAR(10),
    fakultas VARCHAR(50),
    tanggaldaftar DATETIME,
    updated DATETIME )
engine=innodb;

Untuk membaca data dari database, terdapat paling tidak dua cara:

Menggunakan DataReader

Untuk menggunakan DataReader, kita memerlukan Connection, Command dan DataReader itu sendiri. Perlu diketahui bahwa DataReader tidak memiliki Constructor. Kita harus mengisi nilai DataReader menggunakan method ExecuteReader pada suatu objek Command. Berikut contoh menggunakan DataReader:

var conn = new MySqlConnection("Host=localhost;Uid=root;Pwd=123;Database=kampus");
var cmd = new MySqlCommand("SELECT id, namalengkap, gender, fakultas, tanggaldaftar, updated FROM mahasiswa", conn);

//Koneksi harus terbuka untuk menjalankan ExecuteReader
conn.Open();
var r = cmd.ExecuteReader();
//Agar jelas, Anda juga bisa menuliskan:
//MySqlDataReader r = cmd.ExecuteReader();

//Cek apakah DataReader memiliki baris data
if (r.HasRows) {
    //Method Read mencoba untuk membaca satu baris data dari database
    //Menghasilkan true jika ada baris data, false apabila tidak ada baris data
    r.Read();

    Console.WriteLine("Data mahasiswa:");
    //Membaca data perkolom dengan: r[index kolom / nama kolom]
    Console.WriteLine(r[0]); //Kolom pertama:id (index 0)
    Console.WriteLine(r[1]); //Kolom kedua:namalengkap (index 1)
    Console.WriteLine(r[2]); //Kolom ketiga:gender (index 2)
    Console.WriteLine(r["fakultas"]); //Dapat juga menggunakan nama kolom
    Console.WriteLine(((DateTime)r["tanggaldaftar"]).ToString("dd MMMM yyyy"));
    //Kode di atas langsung mengkonversi data menjadi DateTime, kemudian menjadi string.
    r.Close(); //Sebaiknya r (DataReader) ditutup setelah dipakai
}
//Tutup koneksi setelah selesai membaca data
conn.Close();

Properties r, yaitu r.HasRows di dalam kondisi if di atas juga dapat diganti dengan r.Read() jika kita ingin mengecek ada atau tidaknya suatu data sekaligus membaca satu baris data dari database:

if (r.Read()) {
    Console.WriteLine("Data mahasiswa:");
    Console.WriteLine(r[0]); //Kolom pertama: (index 0)
    Console.WriteLine(r[1]); //Kolom kedua:namalengkap (index 1)
    Console.WriteLine(r[2]); //Kolom ketiga:gender (index 2)
    Console.WriteLine(r["fakultas"]); //Dapat juga menggunakan nama kolom
    Console.WriteLine(((DateTime)r["tanggaldaftar"]).ToString("dd MMMM yyyy"));
    //Kode di atas langsung mengkonversi data menjadi DateTime, kemudian menjadi string.
    r.Close(); //Sebaiknya r (DataReader) ditutup setelah dipakai
}

Dan apabila kita ingin membaca seluruh baris data yang ada pada DataReader, kita dapat mengganti if menjadi while. Dan jangan lupa untuk memindahkan perintah r.Close() keluar dari loop while:

while (r.Read()) {
    Console.WriteLine("Data mahasiswa:");
    Console.WriteLine(r[0]); //Kolom pertama: (index 0)
    Console.WriteLine(r[1]); //Kolom kedua:namalengkap (index 1)
    Console.WriteLine(r[2]); //Kolom ketiga:gender (index 2)
    Console.WriteLine(r["fakultas"]); //Dapat juga menggunakan nama kolom
    Console.WriteLine(((DateTime)r["tanggaldaftar"]).ToString("dd MMMM yyyy"));
    //Kode di atas langsung mengkonversi data menjadi DateTime, kemudian menjadi string.
}
r.Close(); //Sebaiknya r (DataReader) ditutup setelah dipakai

Kita juga dapat memindahkan semua baris data pada DataReader ke dalam suatu DataTable:

var conn = new MySqlConnection("Host=localhost;Uid=root;Pwd=123;Database=kampus");
var cmd = new MySqlCommand("SELECT id, namalengkap, gender, fakultas, tanggaldaftar, updated FROM mahasiswa", conn);
//Suatu DataTabel baru bernama TabelMahasiswa
var dt = new DataTable("TabelMahasiswa");

//Koneksi harus terbuka untuk menjalankan ExecuteReader
conn.Open();
var r = cmd.ExecuteReader();
//Baca semua baris data yang dapat diambil dari r ke dalam DataTable dt
dt.Load(r);
conn.Close();

//Kita dapat menggunakan DataTable meskipun koneksi telah ditutup
//Kapanpun kita mau
foreach (DataRow baris in dt.Rows) {
    Console.WriteLine("Data mahasiswa:");
    Console.WriteLine(baris[0]); //Kolom pertama:id (index 0)
    Console.WriteLine(baris["namalengkap"]); //Kolom kedua:namalengkap (index 1)
    Console.WriteLine(baris.Field<string>(2)); //Kolom ketiga: gender berupa string
    Console.WriteLine(baris.Field<string>("fakultas")); //Dapat juga menggunakan nama kolom
    Console.WriteLine(baris.Field<DateTime>("tanggaldaftar").ToString("dd MMMM yyyy"));
    //Baris di atas langsung mengkonversi data menjadi DateTime, kemudian menjadi string.
}

Menggunakan DataAdapter

Menggunakan DataAdapter sebetulnya tidak terlalu berbeda dari contoh DataReader terakhir di atas. Satu kelebihan menggunakan DataAdapter adalah ia secara otomatis membuka dan menutup koneksi:

var conn = new MySqlConnection("Host=localhost;Uid=root;Pwd=123;Database=kampus");
var cmd = new MySqlCommand("SELECT id, namalengkap, gender, fakultas, tanggaldaftar, updated FROM mahasiswa", conn);
var dt = new DataTable("TabelMahasiswa");
//Buat suatu DataAdapter, dan langsung menugaskan cmd di atas sebagai SelectCommand-nya
var adap = new MySqlDataAdapter(cmd);
//Baca semua baris dari perintah cmd ke dalam DataTable
adap.Fill(dt);

foreach (DataRow baris in dt.Rows) {
    Console.WriteLine("Data mahasiswa:");
    Console.WriteLine(baris[0]); //Kolom pertama:id (index 0)
    Console.WriteLine(baris["namalengkap"]); //Kolom kedua:namalengkap (index 1)
    Console.WriteLine(baris.Field<string>(2)); //Kolom ketiga: gender berupa string
    Console.WriteLine(baris.Field<string>("fakultas")); //Dapat juga menggunakan nama kolom
    Console.WriteLine(baris.Field<DateTime>("tanggaldaftar").ToString("dd MMMM yyyy"));
    //Baris di atas langsung mengkonversi data menjadi DateTime, kemudian menjadi string.
}

Perlu diketahui bahwa selain membaca data dengan method Fill di atas, DataAdapter juga dapat secara otomatis mengupdate baris-baris data yang berubah, menginsert baris-baris baru, dan menghapus baris-baris data yang telah dihapus. Atau dengan kata lain, perubahan yang terjadi pada DataTable dikirim juga secara otomatis ke database server. Semua itu dilakukan hanya dengan satu Method: Update. Akan tetapi penggunaan method tersebut tidak akan dibahas di sini.