Bagikan melalui


Mengisi Himpunan Data dari DataAdapter

Berlaku untuk: .NET Framework .NET .NET Standard

Mengunduh ADO.NET

ADO.NET DataSet adalah representasi data residen memori yang menyediakan model pemrograman relasional yang konsisten terlepas dari sumber datanya. DataSet mewakili sekumpulan data lengkap yang menyertakan tabel, batasan, serta hubungan di antara tabel. Karena DataSet tidak bergantung pada sumber data, DataSet dapat menyertakan data lokal ke aplikasi, dan data dari beberapa sumber data. Interaksi dengan sumber data yang sudah ada dikontrol melalui DataAdapter.

Properti SelectCommand dari DataAdapter adalah objek Command yang mengambil data dari sumber data. Properti InsertCommand, UpdateCommand, dan DeleteCommand dari DataAdapter adalah objek Command yang mengelola pembaruan data di sumber data sesuai dengan modifikasi yang dilakukan pada data di DataSet. Properti ini dibahas secara lebih rinci dalam Memperbarui Sumber Data dengan DataAdapters.

Metode Fill dari DataAdapter digunakan untuk mengisi DataSet dengan hasil SelectCommand dari DataAdapter. Fill menganggap argumennya sebagai DataSet untuk diisi, dan objek DataTable, atau nama dari DataTable akan diisi dengan baris yang dikembalikan dari SelectCommand.

Catatan

Menggunakan DataAdapter untuk mengambil semua tabel membutuhkan waktu, terutama jika ada banyak baris dalam tabel. Ini karena mengakses database, menemukan dan memproses data, dan kemudian mentransfer data ke klien cukup memakan waktu. Menarik semua tabel ke klien juga mengunci seluruh baris di server. Untuk meningkatkan performa, Anda bisa menggunakan klausul WHERE untuk sangat mengurangi jumlah baris yang dikembalikan ke klien. Anda juga bisa mengurangi jumlah data yang dikembalikan ke klien hanya dengan secara eksplisit mencantumkan kolom yang diperlukan dalam pernyataan SELECT. Solusi lain yang baik adalah mengambil baris dalam batch (seperti beberapa ratus baris sekaligus) dan hanya mengambil batch berikutnya saat klien selesai dengan batch saat ini.

Metode Fill ini menggunakan objek DataReader secara implisit untuk mengembalikan nama dan jenis kolom yang digunakan untuk membuat tabel di DataSet, dan data untuk mengisi baris tabel di DataSet. Tabel dan kolom hanya dibuat jika belum ada; jika tidak Fill menggunakan skema DataSet yang sudah ada. Jenis kolom dibuat sebagai jenis .NET Framework sesuai dengan tabel pada Pemetaan Tipe Data di ADO.NET. Kunci primer tidak dibuat kecuali ada di sumber data dan DataAdapter.MissingSchemaAction diatur ke MissingSchemaAction.AddWithKey. Jika Fill menemukan bahwa kunci primer ada untuk tabel, kunci primer akan menimpa data di DataSet dengan data dari sumber data untuk baris di mana nilai kolom kunci utama cocok dengan baris yang dikembalikan dari sumber data. Jika tidak ada kunci primer yang ditemukan, data akan ditambahkan ke tabel di DataSet. Fill menggunakan pemetaan apa pun yang mungkin ada saat Anda mengisi DataSet (lihat Pemetaan DataAdapter, DataTable, dan DataColumn).

Catatan

Jika SelectCommand mengembalikan hasil GABUNGAN LUAR, maka DataAdapter tidak akan mengatur nilai PrimaryKey untuk menghasilkan DataTable. Anda harus menentukan sendiri PrimaryKey untuk memastikan bahwa baris duplikat diselesaikan dengan benar.

Contoh kode berikut ini membuat instans SqlDataAdapter yang menggunakan SqlConnection ke database Microsoft SQL Server Northwind dan mengisi DataTable dalam DataSet dengan daftar pelanggan. Pernyataan SQL dan argumen SqlConnection yang diteruskan ke konstruktor SqlDataAdapter digunakan untuk membuat properti SelectCommand dari SqlDataAdapter.

Contoh

// Assumes that connection is a valid SqlConnection object.
string queryString =
"SELECT CustomerID, CompanyName FROM dbo.Customers";
SqlDataAdapter adapter = new SqlDataAdapter(queryString, connection);

DataSet customers = new DataSet();
adapter.Fill(customers, "Customers");

Catatan

Kode yang ditampilkan pada contoh ini tidak secara eksplisit membuka dan menutup Connection. Metode Fill ini secara implisit membuka Connection yang digunakan DataAdapter jika kode ini menemukan bahwa koneksi belum terbuka. Jika Fill membuka koneksi, ia juga menutup koneksi saat Fill selesai. Ini bisa menyederhanakan kode Anda saat Anda berurusan dengan satu operasi seperti Fill atau Update. Namun, jika Anda melakukan beberapa operasi yang memerlukan koneksi terbuka, Anda dapat meningkatkan performa aplikasi Anda dengan secara eksplisit memanggil metode Open dari Connection, melakukan operasi terhadap sumber data, lalu memanggil metode Close dari Connection. Anda harus mencoba untuk menjaga koneksi ke sumber data terbuka sesingkat mungkin untuk membebaskan sumber daya agar digunakan oleh aplikasi klien lain.

Beberapa set hasil

Jika DataAdapter menemukan beberapa tataan hasil, maka ia akan membuat beberapa tabel di DataSet. Tabel-tabel diberi nama default inkremental TabelN, dimulai dengan "Tabel" untuk Table0. Jika nama tabel diteruskan sebagai argumen ke metode Fill, tabel diberi nama default inkremental TableNameN, dimulai dengan "TableName" untuk TableName0.

Mengisi Himpunan Data dari beberapa DataAdapters

Sejumlah objek DataAdapter dapat digunakan dengan DataSet. Setiap DataAdapter dapat digunakan untuk mengisi satu atau beberapa objek DataTable dan menyelesaikan pembaruan kembali ke sumber data yang relevan. Objek DataRelation dan Constraint dapat ditambahkan ke DataSet secara lokal, yang memungkinkan Anda menghubungkan data dari sumber data yang berbeda. Misalnya, DataSet dapat berisi data dari database Microsoft SQL Server, database IBM Db2 yang diekspos melalui OLE DB, dan sumber data yang mengalirkan XML. Satu atau beberapa objek DataAdapter dapat menangani komunikasi ke setiap sumber data.

Contoh

Contoh kode berikut mengisi daftar pelanggan dari Northwind database di Microsoft SQL Server, dan daftar pesanan dari database yang Northwind disimpan di Microsoft Access. Tabel yang diisi terkait dengan DataRelation, dan daftar pelanggan lalu ditampilkan dengan pesanan untuk pelanggan tersebut.

// Assumes that customerConnection and orderConnection are valid SqlConnection objects.
SqlDataAdapter custAdapter = new SqlDataAdapter(
"SELECT * FROM dbo.Customers", customerConnection);
SqlDataAdapter ordAdapter = new SqlDataAdapter(
"SELECT * FROM Orders", orderConnection);

DataSet customerOrders = new DataSet();

custAdapter.Fill(customerOrders, "Customers");
ordAdapter.Fill(customerOrders, "Orders");

DataRelation relation = customerOrders.Relations.Add("CustOrders",
customerOrders.Tables["Customers"].Columns["CustomerID"],
customerOrders.Tables["Orders"].Columns["CustomerID"]);

foreach (DataRow pRow in customerOrders.Tables["Customers"].Rows)
{
    Console.WriteLine(pRow["CustomerID"]);
    foreach (DataRow cRow in pRow.GetChildRows(relation))
        Console.WriteLine("\t" + cRow["OrderID"]);
}

Jenis Desimal SQL Server

Secara default, DataSet menyimpan data dengan menggunakan jenis data .NET. Untuk sebagian besar aplikasi, ini memberikan representasi informasi sumber data yang nyaman. Namun, representasi ini bisa menyebabkan masalah ketika tipe data di sumber data adalah tipe data desimal atau numerik SQL Server. Jenis data .NET decimal memungkinkan maksimum 28 digit signifikan, sedangkan jenis data SQL Server decimal memungkinkan 38 digit signifikan. Jika SqlDataAdapter menentukan selama operasi Fill bahwa presisi bidang SQL Server decimal lebih besar dari 28 karakter, baris saat ini tidak ditambahkan ke DataTable. Sebaliknya, peristiwa FillError terjadi, yang memungkinkan Anda menentukan apakah kehilangan presisi akan terjadi, dan merespons dengan tepat. Untuk informasi selengkapnya tentang peristiwa tersebut FillError , lihat Menangani Peristiwa DataAdapter. Untuk mendapatkan nilai SQL Serverdecimal, Anda juga bisa menggunakan objek SqlDataReader dan memanggil metode GetSqlDecimal.

ADO.NET juga mencakup dukungan yang ditingkatkan DataSetuntuk System.Data.SqlTypes di . Untuk informasi selengkapnya, lihat SqlTypes dan Himpunan Data.

Lihat juga