Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
oleh Scott Mitchell
TableAdapters dalam Himpunan Data Yang Diketik secara otomatis mengurus koneksi ke database, mengeluarkan perintah, dan mengisi DataTable dengan hasilnya. Namun, ada kesempatan ketika kita ingin mengurus detail ini sendiri, dan dalam tutorial ini kita mempelajari cara mengakses pengaturan koneksi database dan tingkat perintah di TableAdapter.
Pendahuluan
Sepanjang seri tutorial, kami telah menggunakan Typed DataSets untuk mengimplementasikan Lapisan Akses Data dan objek bisnis arsitektur berlapis kami. Seperti yang dibahas dalam tutorial pertama, DataTables Typed DataSet berfungsi sebagai repositori data, sedangkan TableAdapters bertindak sebagai pembungkus untuk berkomunikasi dengan database guna mengambil dan memodifikasi data yang mendasarinya. TableAdapters merangkum kompleksitas yang terlibat dalam bekerja dengan database dan mencegah kami dari harus menulis kode untuk menyambung ke database, melakukan perintah, atau mengisi hasilnya ke dalam DataTable.
Namun, ada kalanya kita perlu menggali ke kedalaman TableAdapter dan menulis kode yang berfungsi langsung dengan objek ADO.NET. Dalam Tutorial Membungkus Modifikasi Database dalam Transaksi , misalnya, kami menambahkan metode ke TableAdapter untuk memulai, menerapkan, dan mengembalikan transaksi ADO.NET. Metode ini menggunakan objek internal yang dibuat secara manual SqlTransaction
yang ditetapkan ke objek-objek dalam TableAdapter SqlCommand
.
Dalam tutorial ini kita akan memeriksa cara mengakses pengaturan koneksi database dan tingkat perintah di TableAdapter. Secara khusus, kita akan menambahkan fungsionalitas ke ProductsTableAdapter
yang memungkinkan akses ke string koneksi yang mendasar dan pengaturan batas waktu perintah.
Bekerja dengan Data Menggunakan ADO.NET
Microsoft .NET Framework berisi sejumlah besar kelas yang dirancang khusus untuk bekerja dengan data. Kelas-kelas ini, yang ditemukan dalam System.Data
namespace, disebut sebagai kelas ADO.NET. Beberapa kelas di bawah payung ADO.NET terkait dengan penyedia data tertentu. Anda dapat menganggap penyedia data sebagai saluran komunikasi yang memungkinkan informasi mengalir antara kelas ADO.NET dan penyimpanan data yang mendasar. Ada penyedia umum, seperti OleDb dan ODBC, serta penyedia yang dirancang khusus untuk sistem database tertentu. Misalnya, meskipun dimungkinkan untuk terhubung ke database Microsoft SQL Server menggunakan penyedia OleDb, penyedia SqlClient jauh lebih efisien karena dirancang dan dioptimalkan khusus untuk SQL Server.
Saat mengakses data secara terprogram, pola berikut umumnya digunakan:
- Membuat koneksi ke database.
- Terbitkan perintah.
- Untuk
SELECT
kueri, gunakan hasil rekaman tersebut.
Ada kelas ADO.NET terpisah untuk melakukan masing-masing langkah ini. Untuk menyambungkan ke database menggunakan penyedia SqlClient, misalnya, gunakan SqlConnection
kelas . Untuk mengeluarkan INSERT
, UPDATE
, DELETE
, atau SELECT
perintah ke database, gunakan kelas SqlCommand
.
Kecuali untuk Modifikasi Database dalam Pembungkusan Transaksi, kami tidak perlu menulis kode ADO.NET tingkat rendah apa pun sendiri karena kode yang dihasilkan secara otomatis oleh TableAdapters mencakup fungsionalitas yang diperlukan untuk terhubung ke database, mengeluarkan perintah, mengambil data, dan mengisi data tersebut ke dalam DataTables. Namun, mungkin ada kalanya kita perlu menyesuaikan pengaturan tingkat rendah ini. Selama beberapa langkah berikutnya, kami akan memeriksa cara memanfaatkan objek ADO.NET yang digunakan dalam konteks internal oleh TableAdapters.
Langkah 1: Pemeriksaan menggunakan Sifat Koneksi
Setiap kelas TableAdapter memiliki Connection
properti yang menentukan informasi koneksi database. Tipe data dan nilai ConnectionString
properti ini ditentukan oleh pilihan yang dibuat dalam Wizard Konfigurasi TableAdapter. Ingat bahwa ketika kita pertama kali menambahkan TableAdapter ke DataSet Bertipe, wizard ini meminta sumber basis data dari kita (lihat Gambar 1). Daftar drop-down dalam langkah pertama ini menyertakan database yang ditentukan dalam file konfigurasi serta database lain di Koneksi Data Server Explorer. Jika database yang ingin kami gunakan tidak ada di daftar drop-down, koneksi database baru dapat ditentukan dengan mengklik tombol Koneksi Baru dan memberikan informasi koneksi yang diperlukan.
Gambar 1: Langkah Pertama Wizard Konfigurasi TableAdapter (Klik untuk melihat gambar ukuran penuh)
Mari kita luangkan waktu sejenak untuk memeriksa kode untuk properti TableAdapter s Connection
. Seperti yang disebutkan dalam tutorial Membuat Lapisan Akses Data , kita dapat melihat kode TableAdapter yang dihasilkan secara otomatis dengan masuk ke jendela Tampilan Kelas, menelusuri ke kelas yang sesuai, lalu mengklik dua kali nama anggota.
Navigasi ke jendela Tampilan Kelas dengan masuk ke menu Tampilan dan pilih Tampilan Kelas (atau dengan mengetik Ctrl+Shift+C). Dari bagian atas jendela Tampilan Kelas, telusuri ke namespace NorthwindTableAdapters
dan pilih kelas ProductsTableAdapter
. Ini akan menampilkan anggota ProductsTableAdapter
di bagian bawah Tampilan Kelas, seperti yang ditunjukkan pada Gambar 2. Klik ganda pada properti Connection
untuk melihat kodenya.
Gambar 2: Double-Click Properti Koneksi di Tampilan Kelas untuk Melihat Kode yang Dihasilkan Otomatis
Properti TableAdapter s Connection
dan kode terkait koneksi lainnya mengikuti:
Private _connection As System.Data.SqlClient.SqlConnection
Private Sub InitConnection()
Me._connection = New System.Data.SqlClient.SqlConnection
Me._connection.ConnectionString = _
ConfigurationManager.ConnectionStrings("NORTHWNDConnectionString").ConnectionString
End Sub
Friend Property Connection() As System.Data.SqlClient.SqlConnection
Get
If (Me._connection Is Nothing) Then
Me.InitConnection
End If
Return Me._connection
End Get
Set
Me._connection = value
If (Not (Me.Adapter.InsertCommand) Is Nothing) Then
Me.Adapter.InsertCommand.Connection = value
End If
If (Not (Me.Adapter.DeleteCommand) Is Nothing) Then
Me.Adapter.DeleteCommand.Connection = value
End If
If (Not (Me.Adapter.UpdateCommand) Is Nothing) Then
Me.Adapter.UpdateCommand.Connection = value
End If
Dim i As Integer = 0
Do While (i < Me.CommandCollection.Length)
If (Not (Me.CommandCollection(i)) Is Nothing) Then
CType(Me.CommandCollection(i), _
System.Data.SqlClient.SqlCommand).Connection = value
End If
i = (i + 1)
Loop
End Set
End Property
Ketika kelas TableAdapter dibuat, variabel _connection
anggota sama dengan Nothing
. Ketika properti Connection
diakses, akan pertama-tama memeriksa apakah variabel anggota _connection
telah dibuat. Jika belum, metode InitConnection
dijalankan, yang membuat instans _connection
dan mengatur properti ConnectionString
ke nilai string koneksi yang ditentukan dari langkah pertama Wizard Pengaturan TableAdapter.
Properti Connection
juga dapat ditetapkan ke SqlConnection
objek. Melakukannya mengaitkan objek baru SqlConnection
dengan setiap objek TableAdapter s SqlCommand
.
Langkah 2: Menampilkan Pengaturan Connection-Level
Informasi koneksi harus tetap dienkapsulasi dalam TableAdapter dan tidak dapat diakses oleh lapisan lain dalam arsitektur aplikasi. Namun, mungkin ada skenario ketika informasi tingkat koneksi TableAdapter harus dapat diakses atau disesuaikan untuk kueri, pengguna, atau halaman ASP.NET.
Mari kita perluas ProductsTableAdapter
dalam Himpunan Northwind
Data untuk menyertakan ConnectionString
properti yang dapat digunakan oleh Lapisan Logika Bisnis untuk membaca atau mengubah string koneksi yang digunakan oleh TableAdapter.
Nota
String koneksi adalah string yang menentukan informasi koneksi database, seperti penyedia yang akan digunakan, lokasi database, kredensial autentikasi, dan pengaturan terkait database lainnya. Untuk daftar pola string koneksi yang digunakan oleh berbagai penyimpanan data dan penyedia, lihat ConnectionStrings.com.
Seperti yang dibahas dalam tutorial Membuat Lapisan Akses Data , kelas yang dihasilkan secara otomatis Typed DataSet dapat diperluas melalui penggunaan kelas parsial. Pertama, buat subfolder baru dalam proyek bernama ConnectionAndCommandSettings
di bawah ~/App_Code/DAL
folder.
Gambar 3: Tambahkan Subfolder Bernama ConnectionAndCommandSettings
Tambahkan file kelas baru bernama ProductsTableAdapter.ConnectionAndCommandSettings.vb
dan masukkan kode berikut:
Namespace NorthwindTableAdapters
Partial Public Class ProductsTableAdapter
Public Property ConnectionString() As String
Get
Return Me.Connection.ConnectionString
End Get
Set(ByVal value As String)
Me.Connection.ConnectionString = value
End Set
End Property
End Class
End Namespace
Kelas parsial Public
ini menambahkan properti bernama ConnectionString
ke ProductsTableAdapter
kelas yang memungkinkan lapisan apa pun membaca atau memperbarui string koneksi untuk koneksi yang mendasar TableAdapter.
Dengan kelas sebagian ini dibuat (dan disimpan), buka kelas ProductsBLL
. Buka salah satu metode yang ada dan ketik Adapter
lalu tekan kunci periode untuk memunculkan IntelliSense. Anda akan melihat properti baru ConnectionString
yang tersedia di IntelliSense, yang berarti Anda dapat membaca atau menyesuaikan nilai ini secara terprogram dari BLL.
Mengekspos Seluruh Objek Koneksi
Kelas parsial ini hanya mengekspos satu properti dari objek koneksi yang mendasar: ConnectionString
. Jika Anda ingin membuat seluruh objek koneksi tersedia di luar batas TableAdapter, Anda dapat mengubah Connection
tingkat perlindungan properti secara alternatif. Kode yang dihasilkan secara otomatis yang kami periksa di Langkah 1 menunjukkan bahwa properti TableAdapter s Connection
ditandai sebagai Friend
, yang berarti bahwa itu hanya dapat diakses oleh kelas dalam rakitan yang sama. Namun, ini dapat diubah melalui properti TableAdapter s ConnectionModifier
.
Buka Himpunan Northwind
Data, klik ProductsTableAdapter
di Perancang, dan navigasikan ke jendela Properti. Di sana Anda akan melihat pengaturan ConnectionModifier
ke nilai default Assembly
. Untuk membuat properti Connection
tersedia di luar assembly DataSet Bertipe, ubah properti ConnectionModifier
menjadi Public
.
Gambar 4: Connection
Tingkat Aksesibilitas Properti Dapat Dikonfigurasi melalui ConnectionModifier
Properti (Klik untuk melihat gambar ukuran penuh)
Simpan Himpunan Data lalu kembali ke ProductsBLL
kelas . Seperti sebelumnya, buka salah satu metode yang ada dan ketik Adapter
lalu tekan kunci periode untuk memunculkan IntelliSense. Daftar harus menyertakan Connection
properti, yang berarti bahwa Anda sekarang dapat membaca atau menetapkan pengaturan tingkat koneksi apa pun secara terprogram dari BLL.
Langkah 3: Memeriksa Properti Command-Related
TableAdapter terdiri dari kueri utama yang, secara default, memiliki pernyataan INSERT
, UPDATE
, dan DELETE
yang dihasilkan secara otomatis. Kueri utama ini INSERT
, UPDATE
, dan DELETE
pernyataan diimplementasikan dalam kode TableAdapter sebagai objek adaptor data ADO.NET melalui properti Adapter
. Seperti propertinya Connection
, Adapter
jenis data properti ditentukan oleh penyedia data yang digunakan. Karena tutorial ini menggunakan penyedia SqlClient, properti Adapter
adalah berjenis SqlDataAdapter
.
Properti Adapter
TableAdapter memiliki tiga properti jenis SqlCommand
yang digunakannya untuk mengeluarkan pernyataan INSERT
, UPDATE
, dan DELETE
.
InsertCommand
UpdateCommand
DeleteCommand
Objek SqlCommand
bertanggung jawab untuk mengirim kueri tertentu ke database dan memiliki properti seperti: CommandText
, yang berisi pernyataan SQL ad-hoc atau prosedur tersimpan Parameters
untuk dijalankan; dan SqlParameter
, yang merupakan kumpulan objek. Seperti yang kita lihat kembali dalam tutorial Membuat Lapisan Akses Data , objek perintah ini dapat disesuaikan melalui jendela Properti.
Selain kueri utamanya, TableAdapter dapat menyertakan jumlah variabel metode yang, saat dipanggil, mengirimkan perintah tertentu ke database. Objek perintah kueri utama dan objek perintah untuk semua metode tambahan disimpan di properti TableAdapter s CommandCollection
.
Mari kita luangkan waktu sejenak untuk melihat kode yang dihasilkan oleh ProductsTableAdapter
dalam Northwind
Himpunan Data untuk kedua properti ini dan variabel anggota pendukung dan metode pembantunya:
Private WithEvents _adapter As System.Data.SqlClient.SqlDataAdapter
Private Sub InitAdapter()
Me._adapter = New System.Data.SqlClient.SqlDataAdapter
... Code that creates the InsertCommand, UpdateCommand, ...
... and DeleteCommand instances - omitted for brevity ...
End Sub
Private ReadOnly Property Adapter() As System.Data.SqlClient.SqlDataAdapter
Get
If (Me._adapter Is Nothing) Then
Me.InitAdapter
End If
Return Me._adapter
End Get
End Property
Private _commandCollection() As System.Data.SqlClient.SqlCommand
Private Sub InitCommandCollection()
Me._commandCollection = New System.Data.SqlClient.SqlCommand(8) {}
... Code that creates the command objects for the main query and the ...
... ProductsTableAdapter�s other eight methods - omitted for brevity ...
End Sub
Protected ReadOnly Property CommandCollection() As System.Data.SqlClient.SqlCommand()
Get
If (Me._commandCollection Is Nothing) Then
Me.InitCommandCollection
End If
Return Me._commandCollection
End Get
End Property
Kode untuk properti Adapter
dan CommandCollection
sangat meniru kode properti Connection
. Ada variabel anggota yang menyimpan objek yang digunakan oleh properti. Aksesor properti Get
dimulai dengan memeriksa untuk melihat apakah variabel anggota yang sesuai adalah Nothing
. Jika demikian, metode inisialisasi disebut yang membuat instans variabel anggota dan menetapkan properti terkait perintah inti.
Langkah 4: Mengekspos Pengaturan Command-Level
Idealnya, informasi tingkat perintah harus tetap dienkapsulasi dalam Lapisan Akses Data. Namun, jika informasi ini diperlukan di lapisan arsitektur lain, informasi ini dapat diekspos melalui kelas parsial, sama seperti dengan pengaturan tingkat koneksi.
Karena TableAdapter hanya memiliki satu Connection
properti, kode untuk mengekspos pengaturan tingkat koneksi cukup mudah. Hal-hal sedikit lebih rumit saat memodifikasi pengaturan tingkat perintah karena TableAdapter dapat memiliki beberapa objek perintah - sebuah InsertCommand
, UpdateCommand
, dan DeleteCommand
, bersama dengan objek perintah dalam properti CommandCollection
yang bersifat variabel. Saat memperbarui pengaturan tingkat perintah, pengaturan ini perlu disebarluaskan ke semua objek perintah.
Misalnya, bayangkan bahwa ada kueri tertentu di TableAdapter yang membutuhkan waktu lama yang luar biasa untuk dijalankan. Saat menggunakan TableAdapter untuk menjalankan salah satu kueri tersebut, kita mungkin ingin meningkatkan properti objek perintah.CommandTimeout
Properti ini menentukan jumlah detik untuk menunggu perintah dijalankan dan default menjadi 30.
Agar properti CommandTimeout
dapat disesuaikan oleh pihak BLL, tambahkan metode Public
berikut ke ProductsDataTable
dengan menggunakan berkas kelas parsial yang diberi nama di Langkah 2 (ProductsTableAdapter.ConnectionAndCommandSettings.vb
):
Public Sub SetCommandTimeout(ByVal timeout As Integer)
If Me.Adapter.InsertCommand IsNot Nothing Then
Me.Adapter.InsertCommand.CommandTimeout = timeout
End If
If Me.Adapter.DeleteCommand IsNot Nothing Then
Me.Adapter.DeleteCommand.CommandTimeout = timeout
End If
If Me.Adapter.UpdateCommand IsNot Nothing Then
Me.Adapter.UpdateCommand.CommandTimeout = timeout
End If
For i As Integer = 0 To Me.CommandCollection.Length - 1
If Me.CommandCollection(i) IsNot Nothing Then
Me.CommandCollection(i).CommandTimeout = timeout
End If
Next
End Sub
Metode ini dapat dipanggil dari BLL atau Lapisan Presentasi untuk mengatur batas waktu perintah untuk semua masalah perintah oleh instans TableAdapter tersebut.
Nota
Properti Adapter
dan CommandCollection
ditandai sebagai Private
, yang berarti properti hanya dapat diakses dari kode dalam TableAdapter.
Connection
Tidak seperti properti , pengubah akses ini tidak dapat dikonfigurasi. Oleh karena itu, jika Anda perlu mengekspos properti tingkat perintah ke lapisan lain dalam arsitektur, Anda harus menggunakan pendekatan kelas parsial yang dibahas di atas untuk menyediakan Public
metode atau properti yang membaca atau menulis ke Private
objek perintah.
Ringkasan
TableAdapters dalam Typed DataSet berfungsi untuk merangkum detail dan kompleksitas akses data. Dengan menggunakan TableAdapters, kita tidak perlu khawatir menulis kode ADO.NET untuk menyambungkan ke database, mengeluarkan perintah, atau mengisi hasilnya ke dalam DataTable. Semuanya ditangani secara otomatis untuk kita.
Namun, mungkin ada kalanya kita perlu menyesuaikan spesifik ADO.NET tingkat rendah, seperti mengubah string koneksi atau koneksi default atau nilai batas waktu perintah. TableAdapter telah secara otomatis menghasilkan properti Connection
, Adapter
, dan CommandCollection
, tetapi ini adalah Friend
atau Private
secara default. Informasi internal ini dapat diekspos dengan memperluas TableAdapter menggunakan kelas parsial untuk menyertakan Public
metode atau properti. Atau, pengubah akses properti TableAdapter dapat Connection
dikonfigurasi melalui properti TableAdapter s ConnectionModifier
.
Selamat Pemrograman!
Tentang Penulis
Scott Mitchell, penulis tujuh buku ASP/ASP.NET dan pendiri 4GuysFromRolla.com, telah bekerja sama dengan teknologi Microsoft Web sejak 1998. Scott bekerja sebagai konsultan, pelatih, dan penulis independen. Buku terbarunya adalah Sams Teach Yourself ASP.NET 2.0 dalam 24 Jam. Dia dapat dijangkau di mitchell@4GuysFromRolla.com.
Ucapan terima kasih khusus kepada
Seri tutorial ini ditinjau oleh banyak peninjau yang bermanfaat. Peninjau utama untuk tutorial ini adalah Burnadette Leigh, S ren Jacob Lauritsen, Teresa Murphy, dan Hilton Geisenow. Tertarik untuk meninjau artikel MSDN saya yang akan datang? Jika demikian, hubungi saya di mitchell@4GuysFromRolla.com.