Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Note
Sınıf DataSet ve ilgili sınıflar, uygulamaların veritabanıyla bağlantısı kesilirken uygulamaların bellekteki verilerle çalışmasını sağlayan 2000'lerin başlarındaki eski .NET Framework teknolojileridir. Teknolojiler özellikle kullanıcıların verileri değiştirmesine ve değişiklikleri veritabanında kalıcı hale getirebilmesine olanak tanıyan uygulamalar için kullanışlıdır. Veri kümeleri başarısı kanıtlanmış bir teknoloji olsa da, yeni .NET uygulamaları için önerilen yaklaşım Entity Framework Core kullanmaktır. Entity Framework, tablosal verilerle nesne modelleri olarak çalışmak için daha doğal bir yol sağlar ve daha basit bir programlama arabirimine sahiptir.
Veritabanındaki verileri işleyen bir uygulama oluşturduğunuzda, genellikle bağlantı dizelerini tanımlama, veri ekleme ve saklı yordamları çalıştırma gibi görevleri gerçekleştirirsiniz. Bu makaleyi takip ettikçe, Visual C# veya Visual Basic ve ADO.NET kullanarak veri üzerinden formlar (FOD) Windows Forms uygulamasının içinden veritabanıyla nasıl etkileşim kurabileceğinizi keşfedebilirsiniz. Veri kümeleri, LINQ (Language-Integrated Query) ile SQL ve Entity Framework dahil olmak üzere tüm .NET veri teknolojileri, sonuçta bu makalede gösterilen adımlara benzer adımlar gerçekleştirir.
Bu makalede, bir veritabanından hızla veri alma işlemleri gösterilmektedir. Uygulamanızın verileri önemsiz yollarla değiştirmesi ve veritabanını güncelleştirmesi gerekiyorsa Entity Framework ve veri bağlamayı kullanmayı göz önünde bulundurun. Bunun yapılması, kullanıcı arabirimi denetimlerinizin temel alınan verilerdeki değişikliklerle otomatik olarak eşitlenmesini sağlar.
C# ve Visual Basic için Visual Studio belgeleri GitHub deposuna bakarak bu öğreticinin tam koduna erişebilirsiniz.
Important
Kodu basit tutmak için, üretime hazır bir özel durum işleme sistemi dahil edilmemiştir.
Prerequisites
.NET masaüstü geliştirme ve Veri depolama ve işleme iş yüklerinin yüklü olduğu Visual Studio. Bunları yüklemek için Visual Studio Yükleyicisi'ni açın ve değiştirmek istediğiniz Visual Studio sürümünün yanındaki Değiştir'i seçin.
SQL Server Express LocalDB. SQL Server Express LocalDB'niz yoksa SQL Server indirme sayfasındanyükleyebilirsiniz.
Bu makalede, Visual Studio IDE'nin temel işlevselliği hakkında bilgi sahibi olduğunuz varsayılır. Ayrıca bir Windows Forms uygulaması oluşturabileceğinizi, projeye form ekleyebileceğinizi, formlara düğmeler ve diğer denetimleri ekleyebileceğinizi, denetim özelliklerini ayarlayabileceğinizi ve basit olayları kodlayabileceğinizi varsayar. Bu görevlere alışamıyorsanız, bu kılavuzu başlatmadan önce C# ile Visual Studio'da Windows Forms uygulaması oluşturma öğreticisini veya Visual Basic ile Visual Studio'da Windows Forms uygulaması oluşturma öğreticisini tamamlayın.
Örnek veritabanını ayarlama
Aşağıdaki adımları izleyerek örnek veritabanını oluşturun:
Visual Studio'da Sunucu Gezgini penceresini açın.
Veri Bağlantıları'nı sağ tıklatın ve Yeni SQL Server Veritabanı Oluştur'u seçin.
Sunucu adı için(localdb)\mssqllocaldb girin.
Yeni veritabanı adı içinSales yazın ve Tamam'ı seçin.
Visual Studio, Sunucu Gezgini'ndeki Veri Bağlantıları düğümü altında boş bir Sales veritabanı oluşturur.
Satış verileri bağlantısına sağ tıklayın ve Yeni Sorgu'yu seçin.
Sorgu düzenleyicisi penceresi açılır.
Sales Transact-SQL komut dosyasını panonuza kopyalayın.
T-SQL betiğini sorgu düzenleyicisi penceresine yapıştırın ve ardından Yürüt'e tıklayın.
Kısa bir süre sonra sorgunun çalışması tamamlanıp veritabanı nesneleri oluşturulur. Veritabanı iki tablo içerir: Müşteri ve Siparişler. Bu tablolar başlangıçta veri içermez, ancak oluşturduğunuz uygulamayı çalıştırdığınızda veri ekleyebilirsiniz. Veritabanı ayrıca beş temel saklı yordam içerir.
Formları oluşturma ve denetim ekleme
Windows Forms Uygulaması (.NET Framework) şablonuyla bir C# veya Visual Basic projesi oluşturun ve simpleDataApp olarak adlandırın.
Visual Studio projeyi ve Form1 adlı boş bir Windows formu da dahil olmak üzere çeşitli dosyaları oluşturur.
Çözüm Gezgini'nde projenize iki Windows formu ekleyerek toplamda üç form olmasını sağlayın ve onlara aşağıdaki adları verin:
Navigation
NewCustomer
FillOrCancel
Her form için, aşağıdaki çizimlerde gösterilen metin kutularını, düğmeleri ve diğer denetimleri ekleyin. Her denetim için tabloların tanımladığı özellikleri ayarlayın.
Note
Grup kutusu ve etiket denetimleri netlik katar, ancak kodda kullanılmaz.
Gezinti Formu
Gezinti formu denetimleri
Denetim metni Denetim türü Denetim özellikleri Hesap ekleme Button Ad = btnGoToAdd Siparişi doldurma veya iptal etme Button Ad = btnGoToFillOrCancel Exit Button Ad = btnExit YeniMüşteri formu
NewCustomer formu denetimleri
Etiket/Denetim metni Denetim türü Denetim özellikleri Müşteri adı TextBox Ad = txtCustomerName Müşteri Kimliği TextBox İsim = txtCustomerID
ReadOnly = TrueHesap oluşturma Button Ad = btnCreateAccount Sipariş tutarı NumericUpdown Ad = numOrderAmount
DecimalPlaces = 0
Maksimum = 5000Sipariş tarihi DateTimePicker Ad = dtpOrderDate
Biçim = KısaSipariş ver Button Ad = btnPlaceOrder Finish Button Ad = btnAddFinish Başka bir hesap ekleme Button Ad = btnAddAnotherAccount DoldurVeyaİptalEt formu
FillOrCancel formu denetimleri
Etiket/Denetim metni Denetim türü Denetim özellikleri Sipariş Kimliği TextBox Ad = txtOrderID Siparişi bul Button Ad = btnSiparişIDİleBul Sipariş dolduruluyorsa... DateTimePicker Ad = dtpFillDate
Biçim = Kısa(None) DataGridView Ad = dgvCustomerOrders
ReadOnly = True
RowHeadersVisible = YanlışSiparişi iptal et Button Ad = btnCancelOrder Sipariş tamamlama Button Ad = btnFillOrder Finish Button Ad = btnGuncellemeleriBitir
Bağlantı dizesini depolama
Uygulamanız veritabanına bir bağlantı açmaya çalıştığında, uygulamanızın bağlantı dizesine erişimi olmalıdır. Dizeyi her forma el ile girme gereğini önlemek için dizeyi projenizdeki App.config dosyasında depolayın. Ardından, uygulamanızdaki herhangi bir formdan yöntem çağrıldığında dizeyi döndüren bir yöntem oluşturun.
Bağlantı dizesini bulmak için:
Sunucu Gezgini'nde Satış verileri bağlantısına sağ tıklayın ve özellikler'i seçin.
Bağlantı Dizesi özelliğini bulun ve dize değerini panoya kopyalayın.
Bağlantı dizesini projenizde depolamak için:
Çözüm Gezgini'nde, proje türünüze bağlı olarak aşağıdaki adımlardan birini yapın:
C# projesi için, projenin altındaki Özellikler düğümünü genişletin ve ardından Settings.settings dosyasını açın.
Visual Basic projesi için Tüm Dosyaları Göster'i seçin, Projem düğümünü genişletin ve ardından Settings.settings dosyasını açın.
Ad sütununa connString girin.
Tür listesinde (Bağlantı dizesi) öğesini seçin.
Kapsamı listesinde uygulama seçin.
Değer sütununa bağlantı dizenizi girin (dış tırnak işaretleri olmadan) ve değişikliklerinizi kaydedin.
Caution
Gerçek bir uygulamada, Bağlantı dizeleri ve yapılandırma dosyalarıaçıklandığı gibi bağlantı dizesini güvenli bir şekilde depolamanız gerekir. En iyi güvenlik için, bağlantı dizesinde parola depolamaya dayanmayan bir kimlik doğrulama yöntemi kullanın. Örneğin, şirket içi SQL Server veritabanı için Windows Kimlik Doğrulaması. Daha fazla bilgi için bkz. Bağlantı dizelerini kaydetme ve düzenleme.
Formların kodunu yazma
Bu bölüm, her formun ne yaptığına yönelik kısa genel bakışlar içerir. Ayrıca, formda bir düğme seçtiğinizde temel alınan mantığı tanımlayan kodu da sağlar.
Navigasyon formu
Uygulamayı çalıştırdığınızda Gezinti formu açılır ve aşağıdaki düğmeleri içerir:
Hesap ekleme: NewCustomer formunu açar.
Siparişleri doldurma veya iptal etme: FillOrCancel formunu açar.
Çıkış: Uygulamayı kapatır.
"Gezinti formunu başlangıç formu yapın"
C# projeleri için:
Çözüm Gezgini'ndeProgram.cs açın.
Satırı şu şekilde
Application.Rundeğiştirin:Application.Run(new Navigation());
Visual Basic projeleri için:
Çözüm Gezgini'nde projeye sağ tıklayın ve Özellikler'i seçin.
Proje Tasarımcısı'nda Uygulama sekmesini ve ardından Başlangıç nesnesi listesinde Gezinti'yi seçin.
Gezinti formu için otomatik olarak oluşturulan olay işleyicileri oluşturma
Boş olay işleyicisi yöntemleri oluşturmak için Gezinti formundaki üç düğmenin her birine çift tıklayın. Bir düğmeye çift tıklanması Tasarımcı kod dosyasına otomatik olarak oluşturulan kod ekler ve bu da düğme seçiminin bir olayı tetiklesine olanak tanır.
Tasarımcıda çift tıklama eylemini kullanmak yerine kodu doğrudan kod dosyalarınıza kopyalayıp yapıştırmaya karar verirseniz, olay işleyicisini doğru yönteme ayarladığınızdan emin olun:
Formun kod dosyasının Özellikler penceresinde şimşek araç çubuğu düğmesini kullanarak Olaylar sekmesine geçin.
Click özelliğini arayın ve değerinin doğru olay işleyici yöntemi olduğunu doğrulayın.
Gezinti formu mantığı için kod ekleme
Gezinti formunun kod sayfasında, aşağıdaki kodda gösterildiği gibi üç düğme seçme olay işleyicisinin yöntem gövdelerini tamamlayın.
/// <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();
}
YeniMüşteri formu
Bir müşteri adı girip Hesap oluştur düğmesini seçtiğinizde, NewCustomer formu bir müşteri hesabı oluşturur ve SQL Server yeni müşteri kimliği olarak bir KIMLIK değeri döndürür. Ardından bir tutar ve sipariş tarihi belirtip Sipariş ver düğmesini seçerek yeni hesap için bir sipariş vekleyebilirsiniz .
NewCustomer formu için otomatik olarak oluşturulan olay işleyicileri oluşturma
Dört düğmenin her birine çift tıklayarak NewCustomer formundaki her düğme için boş bir Click olay işleyicisi oluşturun. Düğmelere çift tıklanması, tasarımcı kod dosyasına otomatik olarak üretilen kodu da ekler ve bu sayede bir düğme seçiminin bir olayı tetiklemesine olanak tanır.
NewCustomer form mantığı için kod ekleme
NewCustomer form mantığını tamamlamak için şu adımları izleyin:
Ad alanı
System.Data.SqlClient'yi kapsama alın, böylece üyelerinin adlarını tam olarak nitelemeniz gerekmez.
Sınıfına bazı değişkenler ve yardımcı yöntemler ekleyin.
// 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; }
Dört düğme seçme olay işleyicisi için yöntem gövdelerini tamamlayın.
/// <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(); }
DoldurVeyaİptalEt formu
FillOrCancel formu, sipariş kimliği girdiğinizde sipariş döndürmek için bir sorgu çalıştırır ve ardından Sipariş bul düğmesini seçin. Döndürülen satır salt okunur bir veri tablosunda görünür. Siparişi iptal et düğmesini seçerseniz siparişi iptal edildi (X) olarak işaretleyebilir veya Siparişi doldur düğmesini seçerseniz siparişi doldurulmuş (F) olarak işaretleyebilirsiniz. Sipariş bul düğmesini yeniden seçerseniz, güncelleştirilmiş satır görüntülenir.
FillOrCancel formu için otomatik olarak oluşturulan olay işleyicileri oluşturma
FillOrCancel formundaki dört düğme için, düğmelere çift tıklayarak boş Click olay işleyicileri oluşturun. Düğmelere çift tıklanması, tasarımcı kod dosyasına otomatik olarak üretilen kodu da ekler ve bu sayede bir düğme seçiminin bir olayı tetiklemesine olanak tanır.
FillOrCancel form mantığı için kod ekleme
FillOrCancel form mantığını tamamlamak için aşağıdaki adımları izleyin.
Üyelerin adlarını tam olarak nitelemeniz gerekmeyecek şekilde aşağıdaki iki ad alanını kapsama alın.
sınıfına bir değişken ve yardımcı yöntemi ekleyin.
// 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; } }
Dört düğme seçme olay işleyicisi için yöntem gövdelerini tamamlayın.
/// <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(); }
Uygulamanızı test edin
Uygulamayı çalıştırın ve her şeyin beklendiği gibi çalıştığını doğrulamak için birkaç müşteri ve sipariş oluşturmayı deneyin.
Veritabanının değişikliklerinizle güncelleştirildiğini doğrulamak için:
Sunucu Gezgini'nde Tablolar düğümünü açın.
Müşteriler ve Siparişler düğümlerine sağ tıklayın ve Tablo Verilerini Göster'i seçin.