Membuat aplikasi data sederhana dengan menggunakan ADO.NET
Catatan
Himpunan data dan kelas terkait adalah teknologi .NET Framework warisan dari awal 2000-an yang memungkinkan aplikasi untuk bekerja dengan data dalam memori saat aplikasi terputus dari database. Himpunan data tersebut sangat berguna untuk aplikasi yang mengaktifkan pengguna guna memodifikasi data dan mempertahankan perubahan kembali ke database. Meskipun himpunan data telah terbukti menjadi teknologi yang sangat sukses, sebaiknya aplikasi .NET baru menggunakan Entity Framework Core. Entity Framework menyediakan cara yang lebih alami untuk bekerja dengan data tabular sebagai model objek, dan memiliki antarmuka pemrograman yang lebih sederhana.
Saat Anda membuat aplikasi yang memanipulasi data dalam database, Anda melakukan tugas dasar seperti menentukan string koneksi, menyisipkan data, dan menjalankan prosedur tersimpan. Dengan mengikuti topik ini, Anda dapat menemukan cara berinteraksi dengan database dari dalam aplikasi "formulir atas data" Formulir Windows sederhana dengan menggunakan Visual C# atau Visual Basic dan ADO.NET. Semua teknologi data .NET—termasuk himpunan data, LINQ hingga SQL, dan Entity Framework—pada akhirnya melakukan langkah-langkah yang sangat mirip dengan yang ditunjukkan dalam artikel ini.
Artikel ini menunjukkan cara sederhana untuk mengeluarkan data dari database dengan cepat. Jika aplikasi Anda perlu memodifikasi data dengan cara nontrivial dan memperbarui database, Anda harus mempertimbangkan untuk menggunakan Kerangka Kerja Entitas dan menggunakan pengikatan data untuk menyinkronkan kontrol antarmuka pengguna secara otomatis ke perubahan dalam data yang mendasar.
Penting
Agar kode tetap sederhana, kode tersebut tidak menyertakan penanganan pengecualian siap produksi.
Catatan
Kode lengkap untuk tutorial ini dapat diakses di repositori GitHub dokumen Visual Studio di C# dan Visual Basic.
Prasyarat
Untuk membuat aplikasi, Anda memerlukan:
Visual Studio dengan beban kerja pengembangan desktop .NET dan Penyimpanan data dan pemrosesan terinstal. Untuk menginstalnya, buka penginstal Visual Studio, lalu pilih Ubah(atau Lebih> Ubah) di samping versi Visual Studio yang ingin Anda ubah.
SQL Server Express LocalDB. Jika Anda tidak memiliki SQL Server Express LocalDB, Anda dapat menginstalnya dari halaman unduhan SQL Server.
Topik ini mengasumsikan bahwa Anda terbiasa dengan fungsionalitas dasar Visual Studio IDE dan dapat membuat aplikasi Formulir Windows, menambahkan formulir ke proyek, meletakkan tombol dan kontrol lain pada formulir, mengatur properti kontrol, dan mengodekan peristiwa sederhana. Jika Anda tidak nyaman dengan tugas-tugas ini, kami sarankan Anda menyelesaikan tutorial Membuat aplikasi Formulir Windows di Visual Studio dengan Visual Basic atau tutorial Buat aplikasi Formulir Windows di Visual Studio dengan C# sebelum Anda memulai panduan ini.
Menyiapkan database sampel
Buat database sampel dengan mengikuti langkah-langkah berikut:
Di Visual Studio, buka jendela Penjelajah Server.
Klik kanan pada Koneksi Data dan pilih Buat Database SQL Server Baru.
Dalam kotak teks Nama server, masukkan (localdb)\mssqllocaldb.
Dalam kotak teks Nama database baru, masukkan Penjualan, lalu pilih OK.
Database Penjualan kosong dibuat dan ditambahkan ke simpul Koneksi Data di Server Explorer.
Klik kanan pada koneksi data Penjualan dan pilih Kueri Baru.
Jendela editor kueri terbuka.
Salin skrip Sales Transact-SQL ke clipboard Anda.
Tempelkan skrip T-SQL ke editor kueri, lalu pilih tombol Jalankan.
Setelah beberapa saat, kueri selesai berjalan dan objek database dibuat. Database berisi dua tabel: Pelanggan dan Pesanan. Tabel ini tidak berisi data pada awalnya, tetapi Anda dapat menambahkan data saat menjalankan aplikasi yang Anda buat. Database juga berisi empat prosedur tersimpan sederhana.
Membuat formulir dan menambahkan kontrol
Buat proyek C# atau Visual Basic menggunakan templat aplikasi Formulir Windows (.NET Framework), lalu beri nama SimpleDataApp.
Visual Studio membuat proyek dan beberapa file, termasuk formulir Windows kosong yang bernama Form1.
Tambahkan dua formulir Windows ke proyek Anda sehingga memiliki tiga formulir, lalu beri nama berikut:
Navigasi
NewCustomer
FillOrCancel
Untuk setiap formulir, tambahkan kotak teks, tombol, dan kontrol lain yang muncul dalam ilustrasi berikut. Untuk setiap kontrol, atur properti yang dijelaskan tabel.
Catatan
Kotak grup dan kontrol label menambahkan kejelasan tetapi tidak digunakan dalam kode.
Formulir navigasi
Kontrol untuk formulir Navigasi | Properti |
---|---|
Tombol | Nama = btnGoToAdd |
Tombol | Nama = btnGoToFillOrCancel |
Tombol | Nama = btnExit |
Formulir NewCustomer
Kontrol untuk formulir NewCustomer | Properti |
---|---|
TextBox | Nama = txtCustomerName |
TextBox | Nama = txtCustomerID Readonly = True |
Tombol | Nama = btnCreateAccount |
NumericUpdown | DecimalPlaces = 0 Maksimum = 5000 Nama = numOrderAmount |
DateTimePicker | Format = Pendek Nama = dtpOrderDate |
Tombol | Nama = btnPlaceOrder |
Tombol | Nama = btnAddAnotherAccount |
Tombol | Nama = btnAddFinish |
Formulir FillOrCancel
Kontrol untuk formulir FillOrCancel | Properti |
---|---|
TextBox | Nama = txtOrderID |
Tombol | Nama = btnFindByOrderID |
DateTimePicker | Format = Pendek Nama = dtpFillDate |
DataGridView | Nama = dgvCustomerOrders Readonly = True RowHeadersVisible = False |
Tombol | Nama = btnCancelOrder |
Tombol | Nama = btnFillOrder |
Tombol | Nama = btnFinishUpdates |
Simpan string koneksi
Saat aplikasi Anda mencoba membuka koneksi ke database, aplikasi Anda harus memiliki akses ke string koneksi. Untuk menghindari memasukkan string secara manual pada setiap formulir, simpan string dalam file App.config di proyek Anda, dan buat metode yang mengembalikan string saat metode dipanggil dari formulir apa pun di aplikasi Anda.
Anda dapat menemukan string koneksi dengan mengklik kanan koneksi data Penjualan di Server Explorer dan memilih Properti. Temukan properti ConnectionString, lalu gunakan Ctrl+A, Ctrl+C untuk memilih dan menyalin string ke clipboard.
Jika Anda menggunakan C#, di Penjelajah Solusi, perluas simpul Properti di bawah proyek, lalu buka file Pengaturan.pengaturan. Jika Anda menggunakan Visual Basic, di Penjelajah Solusi, klik Perlihatkan Semua File, perluas simpul Proyek Saya, lalu buka file Settings.settings.
Di kolom Nama, masukkan
connString
.Di daftar Jenis, pilih (String Koneksi).
Di daftar Cakupan, pilih Aplikasi.
Di kolom Nilai, masukkan string koneksi Anda (tanpa tanda kutip luar), lalu simpan perubahan Anda.
Catatan
Dalam aplikasi nyata, Anda harus menyimpan string koneksi dengan aman, seperti yang dijelaskan dalam String koneksi dan file konfigurasi.
Tulis kode untuk formulir
Bagian ini berisi gambaran umum singkat tentang apa yang dilakukan setiap formulir. Ini juga menyediakan kode yang menentukan logika yang mendasar ketika tombol pada formulir diklik.
Formulir navigasi
Formulir Navigasi terbuka saat Anda menjalankan aplikasi. Tombol Tambahkan akun membuka formulir NewCustomer. Tombol Isi atau batalkan pesanan akan membuka formulir FillOrCancel. Tombol Keluar menutup aplikasi.
Buat formulir Navigasi sebagai formulir startup
Jika Anda menggunakan C#, di Penjelajah Solusi, buka Program.cs, lalu ubah Application.Run
baris menjadi ini:Application.Run(new Navigation());
Jika Anda menggunakan Visual Basic, di Penjelajah Solusi, buka jendela Properti, pilih tab Aplikasi, lalu pilih SimpleDataApp.Navigation di daftar formulir Startup.
Membuat penanganan aktivitas yang dibuat secara otomatis
Klik dua kali tiga tombol pada formulir Navigasi untuk membuat metode penanganan aktivitas kosong. Mengklik dua kali tombol juga menambahkan kode yang dibuat secara otomatis dalam file kode Perancang yang memungkinkan klik tombol untuk menaikkan peristiwa.
Catatan
Jika Anda melewati tindakan klik dua kali di perancang dan hanya menyalin kode dan menempelkannya ke dalam file kode Anda, jangan lupa untuk mengatur penanganan aktivitas ke metode yang tepat. Anda dapat melakukan ini di jendela Properti . Beralih ke tab Peristiwa (gunakan tombol toolbar petir) dan cari handler Klik .
Menambahkan kode untuk logika formulir Navigasi
Di halaman kode untuk formulir Navigasi, lengkapi isi metode untuk penanganan aktivitas tiga klik tombol seperti yang ditunjukkan dalam kode berikut.
/// <summary>
/// Opens the NewCustomer form as a dialog box,
/// which returns focus to the calling form when it is closed.
/// </summary>
private void btnGoToAdd_Click(object sender, EventArgs e)
{
Form frm = new NewCustomer();
frm.Show();
}
/// <summary>
/// Opens the FillorCancel form as a dialog box.
/// </summary>
private void btnGoToFillOrCancel_Click(object sender, EventArgs e)
{
Form frm = new FillOrCancel();
frm.ShowDialog();
}
/// <summary>
/// Closes the application (not just the Navigation form).
/// </summary>
private void btnExit_Click(object sender, EventArgs e)
{
this.Close();
}
Catatan
Kode untuk tutorial ini tersedia di C# dan Visual Basic. Untuk mengalihkan bahasa kode pada halaman ini antara C# dan Visual Basic, gunakan pengalih bahasa kode di bagian atas setiap contoh kode.
Formulir NewCustomer
Saat Anda memasukkan nama pelanggan lalu memilih tombol Buat Akun , formulir NewCustomer membuat akun pelanggan, dan SQL Server mengembalikan nilai IDENTITY sebagai ID pelanggan baru. Anda kemudian dapat melakukan pemesanan untuk akun baru dengan menentukan jumlah dan tanggal pesanan dan memilih tombol Pesan.
Membuat penanganan aktivitas yang dibuat secara otomatis
Buat penanganan aktivitas Klik kosong untuk setiap tombol pada formulir NewCustomer dengan mengklik dua kali pada masing-masing dari empat tombol. Mengklik dua kali tombol juga menambahkan kode yang dibuat secara otomatis dalam file kode Perancang yang memungkinkan klik tombol untuk menaikkan peristiwa.
Menambahkan kode untuk logika formulir NewCustomer
Untuk menyelesaikan logika formulir NewCustomer, ikuti langkah-langkah ini.
System.Data.SqlClient
Bawa namespace ke dalam cakupan sehingga Anda tidak perlu sepenuhnya memenuhi syarat nama anggotanya.Tambahkan beberapa variabel dan metode pembantu ke kelas seperti yang ditunjukkan dalam kode berikut.
// Storage for IDENTITY values returned from database. private int parsedCustomerID; private int orderID; /// <summary> /// Verifies that the customer name text box is not empty. /// </summary> private bool IsCustomerNameValid() { if (txtCustomerName.Text == "") { MessageBox.Show("Please enter a name."); return false; } else { return true; } } /// <summary> /// Verifies that a customer ID and order amount have been provided. /// </summary> private bool IsOrderDataValid() { // Verify that CustomerID is present. if (txtCustomerID.Text == "") { MessageBox.Show("Please create customer account before placing order."); return false; } // Verify that Amount isn't 0. else if ((numOrderAmount.Value < 1)) { MessageBox.Show("Please specify an order amount."); return false; } else { // Order can be submitted. return true; } } /// <summary> /// Clears the form data. /// </summary> private void ClearForm() { txtCustomerName.Clear(); txtCustomerID.Clear(); dtpOrderDate.Value = DateTime.Now; numOrderAmount.Value = 0; this.parsedCustomerID = 0; }
Lengkapi isi metode untuk penanganan aktivitas empat klik tombol seperti yang ditunjukkan dalam kode berikut.
/// <summary> /// Creates a new customer by calling the Sales.uspNewCustomer stored procedure. /// </summary> private void btnCreateAccount_Click(object sender, EventArgs e) { if (IsCustomerNameValid()) { // Create the connection. using (SqlConnection connection = new SqlConnection(Properties.Settings.Default.connString)) { // Create a SqlCommand, and identify it as a stored procedure. using (SqlCommand sqlCommand = new SqlCommand("Sales.uspNewCustomer", connection)) { sqlCommand.CommandType = CommandType.StoredProcedure; // Add input parameter for the stored procedure and specify what to use as its value. sqlCommand.Parameters.Add(new SqlParameter("@CustomerName", SqlDbType.NVarChar, 40)); sqlCommand.Parameters["@CustomerName"].Value = txtCustomerName.Text; // Add the output parameter. sqlCommand.Parameters.Add(new SqlParameter("@CustomerID", SqlDbType.Int)); sqlCommand.Parameters["@CustomerID"].Direction = ParameterDirection.Output; try { connection.Open(); // Run the stored procedure. sqlCommand.ExecuteNonQuery(); // Customer ID is an IDENTITY value from the database. this.parsedCustomerID = (int)sqlCommand.Parameters["@CustomerID"].Value; // Put the Customer ID value into the read-only text box. this.txtCustomerID.Text = Convert.ToString(parsedCustomerID); } catch { MessageBox.Show("Customer ID was not returned. Account could not be created."); } finally { connection.Close(); } } } } } /// <summary> /// Calls the Sales.uspPlaceNewOrder stored procedure to place an order. /// </summary> private void btnPlaceOrder_Click(object sender, EventArgs e) { // Ensure the required input is present. if (IsOrderDataValid()) { // Create the connection. using (SqlConnection connection = new SqlConnection(Properties.Settings.Default.connString)) { // Create SqlCommand and identify it as a stored procedure. using (SqlCommand sqlCommand = new SqlCommand("Sales.uspPlaceNewOrder", connection)) { sqlCommand.CommandType = CommandType.StoredProcedure; // Add the @CustomerID input parameter, which was obtained from uspNewCustomer. sqlCommand.Parameters.Add(new SqlParameter("@CustomerID", SqlDbType.Int)); sqlCommand.Parameters["@CustomerID"].Value = this.parsedCustomerID; // Add the @OrderDate input parameter. sqlCommand.Parameters.Add(new SqlParameter("@OrderDate", SqlDbType.DateTime, 8)); sqlCommand.Parameters["@OrderDate"].Value = dtpOrderDate.Value; // Add the @Amount order amount input parameter. sqlCommand.Parameters.Add(new SqlParameter("@Amount", SqlDbType.Int)); sqlCommand.Parameters["@Amount"].Value = numOrderAmount.Value; // Add the @Status order status input parameter. // For a new order, the status is always O (open). sqlCommand.Parameters.Add(new SqlParameter("@Status", SqlDbType.Char, 1)); sqlCommand.Parameters["@Status"].Value = "O"; // Add the return value for the stored procedure, which is the order ID. sqlCommand.Parameters.Add(new SqlParameter("@RC", SqlDbType.Int)); sqlCommand.Parameters["@RC"].Direction = ParameterDirection.ReturnValue; try { //Open connection. connection.Open(); // Run the stored procedure. sqlCommand.ExecuteNonQuery(); // Display the order number. this.orderID = (int)sqlCommand.Parameters["@RC"].Value; MessageBox.Show("Order number " + this.orderID + " has been submitted."); } catch { MessageBox.Show("Order could not be placed."); } finally { connection.Close(); } } } } } /// <summary> /// Clears the form data so another new account can be created. /// </summary> private void btnAddAnotherAccount_Click(object sender, EventArgs e) { this.ClearForm(); } /// <summary> /// Closes the form/dialog box. /// </summary> private void btnAddFinish_Click(object sender, EventArgs e) { this.Close(); }
Formulir FillOrCancel
Formulir FillOrCancel menjalankan kueri untuk mengembalikan pesanan saat Anda memasukkan ID pesanan, lalu pilih tombol Temukan Pesanan . Baris yang dikembalikan muncul dalam kisi data baca-saja. Anda dapat menandai pesanan sebagai dibatalkan (X) jika Anda memilih tombol Batalkan Pesanan , atau Anda dapat menandai pesanan sebagai terisi (F) jika Anda memilih tombol Pesanan Isi. Jika Anda memilih tombol Temukan Pesanan lagi, baris yang diperbarui akan muncul.
Membuat penanganan aktivitas yang dibuat secara otomatis
Buat penanganan aktivitas Klik kosong untuk empat tombol pada formulir FillOrCancel dengan mengklik dua kali tombol. Mengklik dua kali tombol juga menambahkan kode yang dibuat secara otomatis dalam file kode Perancang yang memungkinkan klik tombol untuk menaikkan peristiwa.
Menambahkan kode untuk logika formulir FillOrCancel
Untuk menyelesaikan logika formulir FillOrCancel, ikuti langkah-langkah berikut.
Bawa dua namespace berikut ke dalam cakupan sehingga Anda tidak perlu sepenuhnya memenuhi syarat nama anggota mereka.
Tambahkan variabel dan metode pembantu ke kelas seperti yang ditunjukkan dalam kode berikut.
// Storage for the order ID value. private int parsedOrderID; /// <summary> /// Verifies that an order ID is present and contains valid characters. /// </summary> private bool IsOrderIDValid() { // Check for input in the Order ID text box. if (txtOrderID.Text == "") { MessageBox.Show("Please specify the Order ID."); return false; } // Check for characters other than integers. else if (Regex.IsMatch(txtOrderID.Text, @"^\D*$")) { // Show message and clear input. MessageBox.Show("Customer ID must contain only numbers."); txtOrderID.Clear(); return false; } else { // Convert the text in the text box to an integer to send to the database. parsedOrderID = Int32.Parse(txtOrderID.Text); return true; } }
Lengkapi isi metode untuk penanganan aktivitas empat klik tombol seperti yang ditunjukkan dalam kode berikut.
/// <summary> /// Executes a t-SQL SELECT statement to obtain order data for a specified /// order ID, then displays it in the DataGridView on the form. /// </summary> private void btnFindByOrderID_Click(object sender, EventArgs e) { if (IsOrderIDValid()) { using (SqlConnection connection = new SqlConnection(Properties.Settings.Default.connString)) { // Define a t-SQL query string that has a parameter for orderID. const string sql = "SELECT * FROM Sales.Orders WHERE orderID = @orderID"; // Create a SqlCommand object. using (SqlCommand sqlCommand = new SqlCommand(sql, connection)) { // Define the @orderID parameter and set its value. sqlCommand.Parameters.Add(new SqlParameter("@orderID", SqlDbType.Int)); sqlCommand.Parameters["@orderID"].Value = parsedOrderID; try { connection.Open(); // Run the query by calling ExecuteReader(). using (SqlDataReader dataReader = sqlCommand.ExecuteReader()) { // Create a data table to hold the retrieved data. DataTable dataTable = new DataTable(); // Load the data from SqlDataReader into the data table. dataTable.Load(dataReader); // Display the data from the data table in the data grid view. this.dgvCustomerOrders.DataSource = dataTable; // Close the SqlDataReader. dataReader.Close(); } } catch { MessageBox.Show("The requested order could not be loaded into the form."); } finally { // Close the connection. connection.Close(); } } } } } /// <summary> /// Cancels an order by calling the Sales.uspCancelOrder /// stored procedure on the database. /// </summary> private void btnCancelOrder_Click(object sender, EventArgs e) { if (IsOrderIDValid()) { // Create the connection. using (SqlConnection connection = new SqlConnection(Properties.Settings.Default.connString)) { // Create the SqlCommand object and identify it as a stored procedure. using (SqlCommand sqlCommand = new SqlCommand("Sales.uspCancelOrder", connection)) { sqlCommand.CommandType = CommandType.StoredProcedure; // Add the order ID input parameter for the stored procedure. sqlCommand.Parameters.Add(new SqlParameter("@orderID", SqlDbType.Int)); sqlCommand.Parameters["@orderID"].Value = parsedOrderID; try { // Open the connection. connection.Open(); // Run the command to execute the stored procedure. sqlCommand.ExecuteNonQuery(); } catch { MessageBox.Show("The cancel operation was not completed."); } finally { // Close connection. connection.Close(); } } } } } /// <summary> /// Fills an order by calling the Sales.uspFillOrder stored /// procedure on the database. /// </summary> private void btnFillOrder_Click(object sender, EventArgs e) { if (IsOrderIDValid()) { // Create the connection. using (SqlConnection connection = new SqlConnection(Properties.Settings.Default.connString)) { // Create command and identify it as a stored procedure. using (SqlCommand sqlCommand = new SqlCommand("Sales.uspFillOrder", connection)) { sqlCommand.CommandType = CommandType.StoredProcedure; // Add the order ID input parameter for the stored procedure. sqlCommand.Parameters.Add(new SqlParameter("@orderID", SqlDbType.Int)); sqlCommand.Parameters["@orderID"].Value = parsedOrderID; // Add the filled date input parameter for the stored procedure. sqlCommand.Parameters.Add(new SqlParameter("@FilledDate", SqlDbType.DateTime, 8)); sqlCommand.Parameters["@FilledDate"].Value = dtpFillDate.Value; try { connection.Open(); // Execute the stored procedure. sqlCommand.ExecuteNonQuery(); } catch { MessageBox.Show("The fill operation was not completed."); } finally { // Close the connection. connection.Close(); } } } } } /// <summary> /// Closes the form. /// </summary> private void btnFinishUpdates_Click(object sender, EventArgs e) { this.Close(); }
Menguji aplikasi Anda
Jalankan aplikasi dan coba buat beberapa pelanggan dan pesanan untuk memverifikasi bahwa semuanya berfungsi seperti yang diharapkan. Untuk memverifikasi bahwa database diperbarui dengan perubahan Anda, buka simpul Tabel di Server Explorer, klik kanan pada simpul Pelanggan dan Pesanan , dan pilih Perlihatkan Data Tabel.