Mengisi Himpunan Data dari DataAdapter

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

Properti SelectCommand dari DataAdapter adalah objek Command yang mengambil data dari sumber data. Properti-properti InsertCommand, UpdateCommand, dan DeleteCommand dari DataAdapter adalah objek Command yang mengelola pembaruan data di sumber data berdasarkan 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 mengambil argumen berupa DataSet yang akan diisi, dan objek DataTable, atau nama DataTable yang akan diisi dengan baris yang dikembalikan dari SelectCommand.

Nota

Menggunakan DataAdapter untuk mengambil semua data dari satu tabel memakan waktu, terutama jika ada banyak baris di dalam tabel. Ini karena mengakses database, menemukan dan memproses data, lalu mentransfer data ke klien memakan waktu. Menarik semua tabel ke klien juga mengunci semua baris di server. Untuk meningkatkan performa, Anda dapat menggunakan WHERE klausul untuk sangat mengurangi jumlah baris yang dikembalikan ke klien. Anda juga dapat mengurangi jumlah data yang dikembalikan ke klien hanya dengan secara eksplisit mencantumkan kolom yang SELECT diperlukan dalam pernyataan. Solusi lain yang baik adalah mengambil baris dalam batch (seperti beberapa ratus baris sekaligus) dan hanya mengambil batch berikutnya ketika 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 akan dibuat jika belum ada; jika tidak, maka Fill menggunakan skema DataSet yang sudah ada. Jenis kolom dibuat sebagai jenis .NET Framework sesuai dengan tabel dalam 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, Fill akan menimpa data di dengan data dari sumber data untuk baris yang nilai kolom kunci primernya cocok dengan nilai baris yang dikembalikan dari sumber data. Jika tidak ada kunci primer yang ditemukan, data ditambahkan ke tabel di DataSet. Fill menggunakan pemetaan apa pun yang mungkin ada saat Anda mengisi DataSet (lihat DataAdapter DataTable dan Pemetaan DataColumn).

Nota

Jika SelectCommand mengembalikan hasil OUTER JOIN, DataAdapter tidak akan menetapkan nilai PrimaryKey untuk DataTable yang dihasilkan. Anda harus menentukan PrimaryKey sendiri untuk memastikan bahwa baris duplikat diatasi dengan benar. Untuk informasi selengkapnya, lihat Menentukan Kunci Utama.

Contoh kode berikut membuat sebuah instans SqlDataAdapter yang menggunakan SqlConnection untuk terhubung 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.
Dim queryString As String = _
  "SELECT CustomerID, CompanyName FROM dbo.Customers"
Dim adapter As SqlDataAdapter = New SqlDataAdapter( _
  queryString, connection)

Dim customers As DataSet = New DataSet
adapter.Fill(customers, "Customers")
// 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");

Nota

Kode yang ditampilkan dalam contoh ini tidak secara eksplisit membuka dan menutup Connection. Jika menemukan bahwa koneksi belum terbuka, metode Fill ini akan secara implisit membuka Connection yang digunakan oleh DataAdapter. Jika Fill membuka koneksi, koneksi juga akan menutupnya ketika Fill selesai. Ini dapat 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 Open metode Connection, melakukan operasi terhadap sumber data, lalu memanggil Close metode Connection. Anda harus mencoba untuk menjaga koneksi ke sumber data terbuka sesering mungkin untuk membebaskan sumber daya untuk digunakan oleh aplikasi klien lain.

Banyak Set Hasil

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

Mengisi Dataset dari Beberapa DataAdapter

Berbagai jumlah DataAdapter objek dapat digunakan dengan DataSet. Masing-masing DataAdapter dapat digunakan untuk mengisi satu atau beberapa DataTable objek dan menyelesaikan pembaruan kembali ke sumber data yang relevan. DataRelation dan Constraint objek 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 DataAdapter objek 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 2000. Tabel yang terisi terkait dengan DataRelation, dan daftar pelanggan kemudian ditampilkan beserta pesanan untuk pelanggan tersebut. Untuk informasi selengkapnya tentang DataRelation objek, lihat Menambahkan DataRelations dan Menavigasi DataRelations.

' Assumes that customerConnection is a valid SqlConnection object.
' Assumes that orderConnection is a valid OleDbConnection object.
Dim custAdapter As SqlDataAdapter = New SqlDataAdapter( _
  "SELECT * FROM dbo.Customers", customerConnection)

Dim ordAdapter As OleDbDataAdapter = New OleDbDataAdapter( _
  "SELECT * FROM Orders", orderConnection)

Dim customerOrders As DataSet = New DataSet()
custAdapter.Fill(customerOrders, "Customers")
ordAdapter.Fill(customerOrders, "Orders")

Dim relation As DataRelation = _
  customerOrders.Relations.Add("CustOrders", _
  customerOrders.Tables("Customers").Columns("CustomerID"), _
  customerOrders.Tables("Orders").Columns("CustomerID"))

Dim pRow, cRow As DataRow
For Each pRow In customerOrders.Tables("Customers").Rows
  Console.WriteLine(pRow("CustomerID").ToString())

  For Each cRow In pRow.GetChildRows(relation)
    Console.WriteLine(vbTab & cRow("OrderID").ToString())
  Next
Next
// Assumes that customerConnection is a valid SqlConnection object.
// Assumes that orderConnection is a valid OleDbConnection object.
SqlDataAdapter custAdapter = new SqlDataAdapter(
  "SELECT * FROM dbo.Customers", customerConnection);
OleDbDataAdapter ordAdapter = new OleDbDataAdapter(
  "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 Framework. Untuk sebagian besar aplikasi, ini memberikan representasi informasi sumber data yang nyaman. Namun, representasi ini dapat menyebabkan masalah ketika jenis data di sumber data adalah jenis data desimal atau numerik SQL Server. Jenis data .NET Framework decimal memungkinkan maksimum 28 digit signifikan, sedangkan jenis data SQL Server decimal memungkinkan 38 digit signifikan. SqlDataAdapter Jika selama operasi FillSqlDataAdapter menetapkan bahwa presisi bidang pada SQL Server DataTable lebih besar dari 28 karakter, baris saat ini tidak ditambahkan ke . 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 Server decimal , Anda juga dapat menggunakan SqlDataReader objek dan memanggil GetSqlDecimal metode .

ADO.NET 2.0 memperkenalkan dukungan yang ditingkatkan untuk System.Data.SqlTypes di DataSet. Untuk informasi selengkapnya, lihat SqlTypes dan Himpunan Data.

Bab OLE DB

Himpunan baris hierarkis atau bab (jenis DBTYPE_HCHAPTER OLE DB, jenis adChapter ADO) dapat digunakan untuk mengisi konten DataSet. Ketika OleDbDataAdapter menemukan kolom yang diatur berdasarkan bab selama operasi Fill, maka DataTable dibuat untuk kolom yang diatur berdasarkan bab tersebut, dan tabel tersebut diisi dengan kolom dan baris dari bab tersebut. Tabel yang dibuat untuk kolom bab dinamai dengan menggunakan nama tabel induk dan nama kolom bab dalam formulir "ParentTableNameChapteredColumnName". Jika tabel sudah ada di DataSet yang cocok dengan nama kolom bab, tabel saat ini diisi dengan data bab. Jika tidak ada kolom dalam tabel yang sudah ada yang cocok dengan kolom yang ditemukan di bab, kolom baru akan ditambahkan.

Sebelum tabel dalam DataSet diisi dengan data dalam kolom berbab, hubungan antara tabel induk dan tabel anak dari set baris hierarkis dibuat dengan menambahkan kolom bilangan bulat ke tabel induk dan tabel anak, mengatur agar kolom induk secara kenaikan otomatis, dan membuat DataRelation menggunakan kolom yang ditambahkan dari kedua tabel. Hubungan yang ditambahkan diberi nama dengan menggunakan nama kolom tabel dan bab induk dalam formulir "ParentTableNameChapterColumnName".

Perhatikan bahwa kolom terkait hanya ada di DataSet. Isian berikutnya dari sumber data dapat menyebabkan baris baru ditambahkan ke tabel alih-alih perubahan digabungkan ke dalam baris yang ada.

Perhatikan juga bahwa, jika Anda menggunakan fungsi overload DataAdapter.Fill yang menerima DataTable, hanya tabel tersebut yang akan diisi. Kolom bilangan bulat dengan penambahan otomatis masih akan ditambahkan ke tabel, tetapi tidak ada tabel anak yang akan dibuat atau diisi, dan tidak ada relasi yang akan dibuat.

Contoh berikut menggunakan Penyedia MSDataShape untuk menghasilkan kolom bab pesanan untuk setiap pelanggan dalam daftar pelanggan. A DataSet kemudian diisi dengan data.

Using connection As OleDbConnection = New OleDbConnection( _
  "Provider=MSDataShape;Data Provider=SQLOLEDB;" & _
  "Data Source=(local);Integrated " & _
  "Security=SSPI;Initial Catalog=northwind")

Dim adapter As OleDbDataAdapter = New OleDbDataAdapter( _
  "SHAPE {SELECT CustomerID, CompanyName FROM Customers} " & _
  "APPEND ({SELECT CustomerID, OrderID FROM Orders} AS Orders " & _
  "RELATE CustomerID TO CustomerID)", connection)

Dim customers As DataSet = New DataSet()

adapter.Fill(customers, "Customers")
End Using
using (OleDbConnection connection = new OleDbConnection("Provider=MSDataShape;Data Provider=SQLOLEDB;" +
  "Data Source=(local);Integrated Security=SSPI;Initial Catalog=northwind"))
{
OleDbDataAdapter adapter = new OleDbDataAdapter("SHAPE {SELECT CustomerID, CompanyName FROM Customers} " +
  "APPEND ({SELECT CustomerID, OrderID FROM Orders} AS Orders " +
  "RELATE CustomerID TO CustomerID)", connection);

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

Fill berisi dua tabel: DataSet dan Customers, ketika operasi CustomersOrders selesai, di mana CustomersOrders mewakili kolom bab. Kolom tambahan bernama Orders ditambahkan ke Customers tabel, dan kolom tambahan bernama CustomersOrders ditambahkan ke CustomersOrders tabel. Kolom Orders pada tabel Customers diatur untuk peningkatan otomatis. Sebuah DataRelation, CustomersOrders, dibuat dengan menggunakan kolom yang telah ditambahkan ke tabel, di mana Customers berfungsi sebagai tabel induk. Tabel berikut ini memperlihatkan beberapa hasil sampel.

NamaTabel: Pelanggan

ID Pelanggan Nama Perusahaan Pesanan
ALFKI Alfreds Futterkiste 0
ANATR Ana Trujillo Emparedados y helados 1

TableName: PesananPelanggan

ID Pelanggan ID Pesanan PesananPelanggan
ALFKI 10643 0
ALFKI 10692 0
ANATR 10308 1
ANATR 10625 1

Lihat juga