Bagikan melalui


Mengonfigurasi Pengaturan Tingkat Koneksi dan Perintah Lapisan Akses Data (VB)

oleh Scott Mitchell

Unduh PDF

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:

  1. Membuat koneksi ke database.
  2. Terbitkan perintah.
  3. 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.

Langkah Pertama Panduan Konfigurasi TableAdapter

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.

Double-Click Properti Koneksi dalam Tampilan Kelas untuk Melihat Kode yang Dihasilkan Otomatis

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.

Menambahkan Subfolder Bernama ConnectionAndCommandSettings

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.

Tingkat Aksesibilitas Properti Koneksi Dapat Dikonfigurasi melalui Properti ConnectionModifier

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.

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.