Mengisi Himpunan Data dari DataAdapter
Berlaku untuk: .NET Framework .NET .NET Standard
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 DataSet
untuk System.Data.SqlTypes di . Untuk informasi selengkapnya, lihat SqlTypes dan Himpunan Data.