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.
Note
Kelas DataSet 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. Teknologi ini sangat berguna untuk aplikasi yang memungkinkan pengguna memodifikasi data dan mempertahankan perubahan kembali ke database. Meskipun himpunan data adalah teknologi yang terbukti berhasil, pendekatan yang direkomendasikan untuk aplikasi .NET baru adalah 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 biasanya melakukan tugas seperti menentukan string koneksi, menyisipkan data, dan menjalankan prosedur tersimpan. Saat mengikuti artikel ini, Anda dapat menemukan cara berinteraksi dengan database dalam aplikasi form over data Windows Forms menggunakan Visual C# atau Visual Basic dan ADO.NET. Semua teknologi data .NET, termasuk himpunan data, LINQ (Language-Integrated Query) ke SQL, dan Entity Framework, pada akhirnya melakukan langkah-langkah yang mirip dengan langkah-langkah yang ditunjukkan dalam artikel ini.
Artikel ini menunjukkan cara cepat mengeluarkan data dari database. Jika aplikasi Anda perlu memodifikasi data dengan cara nontrivial dan memperbarui database, pertimbangkan untuk menggunakan Kerangka Kerja Entitas dan pengikatan data. Melakukannya memungkinkan kontrol antarmuka pengguna Anda disinkronkan secara otomatis ke perubahan dalam data yang mendasar.
Untuk mengakses kode lengkap untuk tutorial ini, lihat repositori GitHub dokumen Visual Studio untuk C# dan Visual Basic.
Important
Agar kode tetap sederhana, tidak menyertakan penanganan pengecualian yang siap digunakan dalam produksi.
Prerequisites
Visual Studio dengan pengembangan desktop .NET dan penyimpanan dan pemrosesan data beban kerja terinstal. Untuk menginstalnya, buka Penginstal Visual Studio dan pilih 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.
Artikel ini mengasumsikan bahwa Anda terbiasa dengan fungsionalitas dasar Visual Studio IDE. Ini juga mengasumsikan bahwa Anda dapat membuat aplikasi Windows Forms, menambahkan formulir ke proyek, menambahkan tombol dan kontrol lain ke formulir, mengatur properti kontrol, dan mengodekan peristiwa sederhana. Jika Anda tidak nyaman dengan tugas-tugas ini, selesaikan tutorial Buat aplikasi Windows Forms di Visual Studio dengan C# atau buat aplikasi Windows Forms di Visual Studio dengan Visual Basic sebelum Anda memulai panduan ini.
Menyiapkan database sampel
Buat database sampel dengan mengikuti langkah-langkah berikut:
Di Visual Studio, buka jendela Server Explorer.
Klik kanan Koneksi Data dan pilih Buat Database SQL Server Baru.
Untuk Nama server, masukkan (localdb)\mssqllocaldb.
Untuk Nama database baru, masukkan Penjualan, lalu pilih OK.
Visual Studio membuat database Penjualan kosong di bawah simpul Koneksi Data di Server Explorer.
Klik kanan koneksi data Penjualan dan pilih Kueri Baru.
Jendela editor kueri terbuka.
Salin skrip Transact-SQL Penjualan ke clipboard Anda.
Tempelkan skrip T-SQL ke jendela editor kueri, lalu pilih 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 lima prosedur tersimpan dasar.
Membuat formulir dan menambahkan kontrol
Buat proyek C# atau Visual Basic dengan templat Windows Forms App (.NET Framework) dan beri nama SimpleDataApp.
Visual Studio membuat proyek dan beberapa file, termasuk formulir Windows kosong bernama Form1.
Di Penjelajah Solusi, tambahkan dua formulir Windows ke proyek Anda sehingga memiliki total tiga formulir, dan beri nama berikut:
Navigation
NewCustomer
FillOrCancel
Untuk setiap formulir, tambahkan kotak teks, tombol, dan kontrol lain yang diperlihatkan dalam ilustrasi berikut. Untuk setiap kontrol, atur properti yang dijelaskan tabel.
Note
Kotak grup dan kontrol label menambahkan kejelasan, tetapi tidak digunakan dalam kode.
formulir Navigasi
Kontrol untuk formulir Navigasi
Mengontrol teks Jenis kontrol Properti kontrol Tambahkan akun Button Nama = btnGoToAdd Mengisi atau membatalkan pesanan Button Nama = btnGoToFillOrCancel Exit Button Nama = btnExit formulir NewCustomer
Kontrol untuk formulir NewCustomer
Teks Antarmuka/Kendali Jenis kontrol Properti kontrol Nama pelanggan TextBox Nama = txtCustomerName ID Pelanggan TextBox Nama = txtCustomerID
ReadOnly = HanyaBacaBuat akun Button Nama = btnCreateAccount Jumlah pesanan NumericUpdown Nama = numOrderAmount
DecimalPlaces = 0
Maksimum = 5000Tanggal pesanan DateTimePicker Nama = dtpOrderDate
Format = PendekTempatkan pesanan Button Nama = btnPlaceOrder Finish Button Nama = btnAddFinish Menambahkan akun lain Button Nama = btnAddAnotherAccount formulir FillOrCancel
Kontrol untuk formulir FillOrCancel
Teks Antarmuka/Kendali Jenis kontrol Properti kontrol ID Pesanan TextBox Nama = txtOrderID Temukan pesanan Button Nama = btnFindByOrderID Jika mengisi pesanan... DateTimePicker Nama = dtpFillDate
Format = Pendek(None) DataGridView Nama = dgvCustomerOrders
ReadOnly = HanyaBaca
RowHeadersVisible = FalseBatalkan pesanan Button Nama = btnCancelOrder Pemenuhan pesanan Button Nama = btnFillOrder Finish Button Nama = btnFinishUpdates
Menyimpan string koneksi
Saat aplikasi Anda mencoba membuka koneksi ke database, aplikasi Anda harus memiliki akses ke string koneksi. Untuk menghindari kebutuhan untuk memasukkan string secara manual pada setiap formulir, simpan string dalam file App.config di proyek Anda. Kemudian, buat metode yang mengembalikan string saat metode dipanggil dari formulir apa pun di aplikasi Anda.
Untuk menemukan string koneksi:
Di Server Explorer, klik kanan koneksi data Penjualan , lalu pilih Properti.
Temukan properti String Koneksi dan salin nilai stringnya ke clipboard.
Untuk menyimpan string koneksi di proyek Anda:
Di Penjelajah Solusi, lakukan salah satu langkah berikut, bergantung pada jenis proyek Anda:
Untuk proyek C#, perluas simpul Properti di bawah proyek, lalu buka file Settings.settings .
Untuk proyek Visual Basic, pilih Perlihatkan Semua File, perluas simpul Proyek Saya , lalu buka file Pengaturan.pengaturan .
Di kolom Nama , masukkan connString.
Di daftar Jenis , pilih (String koneksi).
Dalam daftar Cakupan, pilih Aplikasi.
Di kolom Nilai, masukkan string koneksi Anda (tanpa tanda kutip luar), lalu simpan perubahan Anda.
Caution
Dalam aplikasi nyata, Anda harus menyimpan string koneksi dengan aman, seperti yang dijelaskan dalam string koneksi dan file konfigurasi. Untuk keamanan terbaik, gunakan metode autentikasi yang tidak mengandalkan penyimpanan kata sandi dalam string koneksi. Misalnya, Autentikasi Windows untuk database SQL Server lokal. Untuk informasi selengkapnya, lihat Menyimpan dan mengedit string koneksi.
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 saat Anda memilih tombol pada formulir.
Bentuk Navigasi
Formulir Navigasi terbuka saat Anda menjalankan aplikasi dan menyertakan tombol berikut:
Menambahkan akun: Membuka formulir NewCustomer .
Mengisi atau membatalkan pesanan: Membuka formulir FillOrCancel .
Keluar: Menutup aplikasi.
Tetapkan formulir Navigasi sebagai formulir startup
Untuk proyek C#:
Di Penjelajah Solusi, buka Program.cs.
Ubah baris menjadi
Application.Run:Application.Run(new Navigation());
Untuk proyek Visual Basic:
Di Penjelajah Solusi, klik kanan proyek dan pilih Properti.
Di Perancang Proyek, pilih tab Aplikasi , lalu pilih Navigasi di daftar objek Startup .
Membuat penanganan aktivitas yang dibuat secara otomatis untuk formulir Navigasi
Untuk membuat metode penanganan aktivitas kosong, klik dua kali masing-masing dari tiga tombol pada formulir Navigasi. Mengklik dua kali tombol menambahkan kode yang dibuat secara otomatis dalam file kode Perancang, yang memungkinkan pilihan tombol untuk menaikkan peristiwa.
Jika Anda memutuskan untuk menyalin dan menempelkan kode langsung ke file kode Anda alih-alih menggunakan tindakan klik dua kali di perancang, pastikan Anda mengatur penanganan aktivitas ke metode yang tepat:
Di jendela Properti file kode untuk formulir, beralihlah ke tab Peristiwa dengan menggunakan tombol toolbar petir.
Cari properti Klik dan verifikasi nilainya adalah metode penanganan aktivitas yang benar.
Menambahkan kode untuk logika formulir Navigasi
Di halaman kode untuk formulir Navigasi, lengkapi isi metode untuk tiga penanganan aktivitas pemilihan 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();
}
Formulir Pelanggan Baru
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 Tempatkan pesanan .
Membuat penanganan aktivitas yang dibuat secara otomatis untuk formulir NewCustomer
Buat penanganan aktivitas Klik kosong untuk setiap tombol pada formulir NewCustomer dengan mengklik dua kali masing-masing dari empat tombol. Mengklik dua kali tombol juga menambahkan kode yang dibuat secara otomatis dalam file kode Perancang yang memungkinkan tombol pilih untuk menaikkan peristiwa.
Menambahkan kode untuk logika formulir NewCustomer
Untuk menyelesaikan logika formulir NewCustomer, ikuti langkah-langkah berikut:
System.Data.SqlClientBawa namespace ke dalam cakupan sehingga Anda tidak perlu sepenuhnya memenuhi syarat nama anggotanya.
Tambahkan beberapa variabel dan metode pembantu ke kelas .
// 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 yang dipilih tombol empat.
/// <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 IsiAtauBatalkan
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 Isi pesanan . Jika Anda memilih tombol Temukan pesanan lagi, baris yang diperbarui akan muncul.
Membuat penanganan aktivitas yang dibuat secara otomatis untuk formulir FillOrCancel
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 tombol pilih untuk menaikkan peristiwa.
Menambahkan kode untuk logika formulir FillOrCancel
Untuk menyelesaikan logika formulir FillOrCancel, ikuti langkah-langkah berikut.
Masukkan dua namespace berikut ke dalam ruang lingkup sehingga Anda tidak perlu menyebutkan nama lengkap anggota mereka.
Tambahkan variabel dan metode pembantu ke kelas .
// 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 yang dipilih tombol empat.
/// <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 simpul Pelanggan dan Pesanan , dan pilih Perlihatkan Data Tabel.