Программное создание базы данных SQL Server с помощью ADO.NET и Visual C# .NET
В этой статье описывается, как программно создать базу данных SQL Server с помощью ADO.NET и Visual C# .NET.
Исходная версия продукта: Visual C #
Исходный номер базы знаний: 307283
Аннотация
В этой пошаговой статье показано, как создать базу данных Microsoft SQL Server с помощью ADO.NET и Visual C# .NET, так как программистам часто требуется программное создание баз данных.
- Сведения о версии Microsoft Visual Basic .NET см. в статье Создание базы данных SQL Server программными средствами с помощью ADO.NET и Visual Basic .NET.
- Microsoft Visual C++ версии этой статьи см. в статье Создание базы данных SQL Server программным способом с помощью ADO.NET и Visual C++ .NET.
В этой статье описывается следующее пространство имен Библиотеки классов Microsoft платформа .NET Framework: System.Data.SqlClient .
Действия по созданию базы данных SQL Server
Чтобы создать базу данных, выполните следующие действия.
- Создайте новое приложение .NET для .NET для Visual C# для Windows.
- Поместите кнопку на Form1. Измените свойство Name кнопки на btnCreateDatabase, а затем измените свойство на Text Create Database.
- Используйте инструкцию using в пространствах имен System и System.Data , чтобы позже в коде не нужно было квалифицировать объявления в этих пространствах имен. Добавьте следующий код в раздел Общие объявления Формы 1:
using System; using System.Data.SqlClient;
String str; SqlConnection myConn = new SqlConnection ("Server=localhost;Integrated security=SSPI;database=master"); str = "CREATE DATABASE MyDatabase ON PRIMARY " + "(NAME = MyDatabase_Data, " + "FILENAME = 'C:\\MyDatabaseData.mdf', " + "SIZE = 2MB, MAXSIZE = 10MB, FILEGROWTH = 10%)" + "LOG ON (NAME = MyDatabase_Log, " + "FILENAME = 'C:\\MyDatabaseLog.ldf', " + "SIZE = 1MB, " + "MAXSIZE = 5MB, " + "FILEGROWTH = 10%)"; SqlCommand myCommand = new SqlCommand(str, myConn); try < myConn.Open(); myCommand.ExecuteNonQuery(); MessageBox.Show("DataBase is Created Successfully", "MyProgram", MessageBoxButtons.OK, MessageBoxIcon.Information); >catch (System.Exception ex) < MessageBox.Show(ex.ToString(), "MyProgram", MessageBoxButtons.OK, MessageBoxIcon.Information); >finally < if (myConn.State == ConnectionState.Open) < myConn.Close(); >>
- Этот код создает пользовательскую базу данных с определенными свойствами.
- Папка, в которую будут храниться созданные MDF- и LDF-файлы, должна уже существовать перед выполнением кода, иначе будет создано исключение.
- Если вы хотите создать базу данных, аналогичную базе данных модели SQL Server, и хотите, чтобы база данных была в расположении по умолчанию, измените переменную str в коде, как показано в следующем примере кода: str = «CREATE DATABASE MyDatabase»
Ссылки
- Создание базы данных
- Новые возможности ADO.NET
Создание простого приложения для работы с данными с помощью ADO.NET
Область применения:Visual Studio Visual Studio для Mac
Visual Studio Code ![]()
Наборы данных и связанные классы являются устаревшими технологиями платформа .NET Framework с начала 2000-х годов, которые позволяют приложениям работать с данными в памяти во время отключения приложений от базы данных. Они особенно полезны для приложений, которые позволяют пользователям изменять данные и сохранять изменения обратно в базу данных. Хотя наборы данных оказались очень успешными, мы рекомендуем новым приложениям .NET использовать Entity Framework Core. Entity Framework предоставляет более естественный способ работы с табличными данными в виде объектных моделей, и он имеет более простой интерфейс программирования.
При создании приложения, которое работает с данными в базе данных, необходимо выполнить такие основные задачи, как определение строк подключения, вставка данных и выполнение хранимых процедур. Следуя этому разделу, вы можете узнать, как взаимодействовать с базой данных из простого приложения Windows Forms по данным с помощью Visual C# или Visual Basic и ADO.NET. Все технологии данных .NET, включая наборы данных, LINQ to SQL и Entity Framework, в конечном счете выполняют действия, которые очень похожи на приведенные в этой статье.
В этой статье демонстрируется простой способ быстрого получения данных из базы данных. Если приложению необходимо изменить данные в нетривиальных способах и обновить базу данных, следует рассмотреть возможность использования Entity Framework и использования привязки данных для автоматической синхронизации элементов управления пользовательским интерфейсом с изменениями в базовых данных.
С целью упрощения код не включает обработку исключений для выполнения в рабочей среде.
Полный код для этого руководства можно получить в репозитории GitHub в Visual Studio в C# и Visual Basic.
Необходимые компоненты
Чтобы создать приложение, вам потребуется:
- Visual Studio с установленными рабочими нагрузками разработки классических приложений .NET и хранилища данных и обработки. Чтобы установить их, откройте Visual Studio Installer и нажмите кнопку «Изменить» (или «Изменить >«) рядом с версией Visual Studio, которую вы хотите изменить.
- SQL Server Express LocalDB. Если у вас нет SQL Server Express LocalDB, его можно установить на странице загрузки SQL Server.
В этом разделе предполагается, что вы знакомы с основными функциями интегрированной среды разработки Visual Studio и можете создавать приложения Windows Forms, добавлять формы в проект, помещать кнопки и другие элементы управления в формы, задавать свойства элементов управления и кодировать простые события. Если вы не знакомы с этими задачами, мы рекомендуем завершить создание приложения Windows Forms в Visual Studio с помощью руководства по Visual Basic или создать приложение Windows Forms в Visual Studio с помощью руководства по C# , прежде чем начать это пошаговое руководство.
Настройка образца базы данных
Создайте образец базы данных, выполнив следующие действия.
- В Visual Studio откройте окно Обозреватель сервера.
- Щелкните правой кнопкой мыши Подключение данных и выберите «Создать базу данных SQL Server».
- В текстовом поле имени сервера введите (localdb)\mssqllocaldb.
- В текстовом поле «Новое имя базы данных» введите sales, а затем нажмите кнопку «ОК«. Пустая база данных sales создается и добавляется в узел data Подключение ions в сервере Обозреватель.
- Щелкните правой кнопкой мыши подключение к данным о продажах и выберите «Создать запрос«. Откроется окно редактора запросов.
- Скопируйте скрипт Sales Transact-SQL в буфер обмена.
- Вставьте скрипт T-SQL в редактор запросов и нажмите кнопку «Выполнить «. Через некоторое время запрос завершает выполнение и создаются объекты базы данных. База данных содержит две таблицы: Customer и Orders. Эти таблицы изначально не содержат данных, но при запуске создаваемого приложения можно добавить данные. База данных также содержит четыре простых хранимых процедуры.
Создание форм и добавление элементов управления
- Создайте проект C# или Visual Basic с помощью шаблона приложения Windows Forms (платформа .NET Framework), а затем назовите его SimpleDataApp. Visual Studio создает проект и несколько файлов, включая пустую форму Windows Forms с именем Form1.
- Добавьте две формы Windows Forms в проект, чтобы он включал три формы, и назначьте им следующие имена:
- Переходы
- NewCustomer
- FillOrCancel
- Для каждой формы добавьте текстовые поля, кнопки и другие элементы управления, которые отображаются на рисунках ниже. Для каждого элемента управления задайте свойства, указанные в таблицах.
Примечание. Элементы управления «группа» и «надпись» обеспечивают большую ясность, но не используются в коде.
Форма навигации
| Элементы управления формы навигации | Свойства |
|---|---|
| Кнопка | Name = btnGoToAdd |
| Кнопка | Name = btnGoToFillOrCancel |
| Кнопка | Name = btnExit |
Форма NewCustomer

Форма FillOrCancel

Сохранение строки подключения
Когда приложение пытается открыть подключение к базе данных, оно должно иметь доступ к строке подключения. Чтобы избежать ввода строки вручную в каждой форме, сохраните строку в файле App.config в проекте и создайте метод, возвращающий строку при вызове метода из любой формы в приложении.
Вы можете найти строка подключения, щелкнув правой кнопкой мыши подключение к данным о продажах в сервере Обозреватель и выбрав свойства. Найдите свойство Подключение ionString, а затем нажмите клавиши CTRL+A, CTRL+C, чтобы выбрать и скопировать строку в буфер обмена.

- Если вы используете C#, в Обозреватель решений разверните узел свойств в проекте и откройте файл Параметры.settings. Если вы используете Visual Basic, в Обозреватель решений щелкните «Показать все файлы«, разверните узел «Мой проект» и откройте файл Параметры.settings.
- В столбце «Имя» введите connString .
- В списке «Тип« выберите (Подключение ion String).
- В списке областей выберите «Приложение«.
- В столбце «Значение» введите строка подключения (без каких-либо внешних кавычек), а затем сохраните изменения.
В реальном приложении необходимо безопасно хранить строка подключения, как описано в строках Подключение ion и файлах конфигурации.
Написание кода для форм
В этом разделе содержатся краткие сведения о том, что делает каждая форма. Он также предоставляет код, определяющий базовую логику при нажатии кнопки в форме.
Форма навигации
Форма навигации открывается при запуске приложения. Кнопка Добавить учетную запись открывает форму NewCustomer. Кнопка Выполнение или отмена заказов открывает форму FillOrCancel. Кнопка Выход закрывает приложение.
Преобразование формы навигации в начальную форму
При использовании C# в обозревателе решений откройте файл Program.cs и измените строку Application.Run на следующую: Application.Run(new Navigation());
Если вы используете Visual Basic, в Обозреватель решений откройте окно «Свойства«, перейдите на вкладку «Приложение«, а затем выберите SimpleDataApp.Navigation в списке форм запуска.
Создание обработчиков событий автоматического создания
Дважды щелкните три кнопки в форме навигации, чтобы создать пустые методы обработчика событий. Дважды щелкнув кнопки, также добавляет автоматически созданный код в файл кода конструктора, который позволяет нажатию кнопки вызывать событие.
Если вы пропустите действие двойного щелчка в конструкторе и просто скопируйте код и вставьте его в файлы кода, не забудьте задать обработчик событий правильным методом. Это можно сделать в окне «Свойства «. Перейдите на вкладку «События» (используйте кнопку панели инструментов молнии) и найдите обработчик щелчка .
Добавление кода для логики формы навигации
На кодовой странице формы навигации заполните тела методов для трех обработчиков событий нажатия кнопки, как показано в следующем коде.
////// Opens the NewCustomer form as a dialog box, /// which returns focus to the calling form when it is closed. /// private void btnGoToAdd_Click(object sender, EventArgs e) < Form frm = new NewCustomer(); frm.Show(); >////// Opens the FillorCancel form as a dialog box. /// private void btnGoToFillOrCancel_Click(object sender, EventArgs e) < Form frm = new FillOrCancel(); frm.ShowDialog(); >////// Closes the application (not just the Navigation form). /// private void btnExit_Click(object sender, EventArgs e)
''' ''' Opens the NewCustomer form as a dialog box, which returns focus to the calling form when it closes. ''' Private Sub btnGoToAdd_Click(sender As Object, e As EventArgs) Handles btnGoToAdd.Click Dim frm As Form = New NewCustomer() frm.Show() End Sub ''' ''' Opens the FillOrCancel form as a dialog box. ''' Private Sub btnGoToFillOrCancel_Click(sender As Object, e As EventArgs) Handles btnGoToFillOrCancel.Click Dim frm As Form = New FillOrCancel() frm.ShowDialog() End Sub ''' ''' Closes the application (not just the navigation form). ''' Private Sub btnExit_Click(sender As Object, e As EventArgs) Handles btnExit.Click Me.Close() End Sub
Код для этого руководства доступен в C# и Visual Basic. Чтобы переключить язык кода на этой странице между C# и Visual Basic, используйте переключатель языка кода в верхней части каждого примера кода.
Форма NewCustomer
При вводе имени клиента и нажатии кнопки «Создать учетную запись » форма NewCustomer создает учетную запись клиента, а SQL Server возвращает значение IDENTITY в качестве нового идентификатора клиента. Затем вы можете разместить заказ для новой учетной записи, указав сумму и дату заказа и нажав кнопку «Заказ места «.
Создание обработчиков событий автоматического создания
Создайте пустой обработчик событий Click для каждой кнопки в форме NewCustomer, дважды щелкнув каждую из четырех кнопок. Дважды щелкнув кнопки, также добавляет автоматически созданный код в файл кода конструктора, который позволяет нажатию кнопки вызывать событие.
Добавление кода для логики формы NewCustomer
Чтобы завершить логику формы NewCustomer, выполните следующие действия.
System.Data.SqlClient Доведите пространство имен в область, чтобы вам не нужно полностью квалифицировать имена его членов.
using System.Data.SqlClient;
Imports System.Data.SqlClient
Добавьте в класс некоторые переменные и вспомогательные методы, как показано в следующем коде.
// Storage for IDENTITY values returned from database. private int parsedCustomerID; private int orderID; ////// Verifies that the customer name text box is not empty. /// private bool IsCustomerNameValid() < if (txtCustomerName.Text == "") < MessageBox.Show("Please enter a name."); return false; >else < return true; >> ////// Verifies that a customer ID and order amount have been provided. /// 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; >> ////// Clears the form data. /// private void ClearForm()
' Storage for ID values returned from the database. Private parsedCustomerID As Integer Private orderID As Integer ''' ''' Verifies that the customer name text box is not empty. ''' Private ReadOnly Property IsCustomerNameValid As Boolean Get If txtCustomerName.Text = "" Then MessageBox.Show("Please enter a name.") Return False Else Return True End If End Get End Property ''' ''' Verifies the order data is valid. ''' Private Function IsOrderDataValid() As Boolean ' Verify that CustomerID is present. If txtCustomerID.Text = "" Then MessageBox.Show("Please create a customer account before placing order.") Return False ' Verify that order amount isn't 0. ElseIf (numOrderAmount.Value < 1) Then MessageBox.Show("Please specify an order amount.") Return False Else ' Order can be submitted. Return True End If End Function ''' ''' Clears values from controls. ''' Private Sub ClearForm() txtCustomerName.Clear() txtCustomerID.Clear() dtpOrderDate.Value = DateTime.Now numOrderAmount.Value = 0 Me.parsedCustomerID = 0 End Sub
Заполните тела метода для четырех обработчиков событий нажатия кнопки, как показано в следующем коде.
////// Creates a new customer by calling the Sales.uspNewCustomer stored procedure. /// 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(); >> > > > ////// Calls the Sales.uspPlaceNewOrder stored procedure to place an order. /// 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(); >> > > > ////// Clears the form data so another new account can be created. /// private void btnAddAnotherAccount_Click(object sender, EventArgs e) < this.ClearForm(); >////// Closes the form/dialog box. /// private void btnAddFinish_Click(object sender, EventArgs e)
''' ''' Creates a new account by executing the Sales.uspNewCustomer ''' stored procedure on the database. ''' Private Sub btnCreateAccount_Click(sender As Object, e As EventArgs) Handles btnCreateAccount.Click ' Ensure a customer name has been entered. If IsCustomerNameValid Then ' Create the SqlConnection object. Using connection As New SqlConnection(My.Settings.connString) ' Create a SqlCommand, and identify the command type as a stored procedure. Using sqlCommand As New SqlCommand("Sales.uspNewCustomer", connection) sqlCommand.CommandType = CommandType.StoredProcedure ' Add the customer name input parameter for the stored procedure. sqlCommand.Parameters.Add(New SqlParameter("@CustomerName", SqlDbType.NVarChar, 40)) sqlCommand.Parameters("@CustomerName").Value = txtCustomerName.Text ' Add the customer ID output parameter. sqlCommand.Parameters.Add(New SqlParameter("@CustomerID", SqlDbType.Int)) sqlCommand.Parameters("@CustomerID").Direction = ParameterDirection.Output Try ' Open the connection. connection.Open() ' Run the stored procedure. sqlCommand.ExecuteNonQuery() ' Convert the Customer ID value to an Integer. Me.parsedCustomerID = CInt(sqlCommand.Parameters("@CustomerID").Value) ' Insert the customer ID into the corresponding text box. Me.txtCustomerID.Text = Convert.ToString(parsedCustomerID) Catch MessageBox.Show("Customer ID was not returned. Account could not be created.") Finally ' Close the connection. connection.Close() End Try End Using End Using End If End Sub ''' ''' Places the order by executing the Sales.uspPlaceNewOrder ''' stored procedure on the database. ''' Private Sub btnPlaceOrder_Click(sender As Object, e As EventArgs) Handles btnPlaceOrder.Click If IsOrderDataValid() Then ' Create the connection. Using connection As New SqlConnection(My.Settings.connString) ' Create SqlCommand and identify it as a stored procedure. Using sqlCommand As New SqlCommand("Sales.uspPlaceNewOrder", connection) sqlCommand.CommandType = CommandType.StoredProcedure ' Add the @CustomerID parameter, which was an output parameter from uspNewCustomer. sqlCommand.Parameters.Add(New SqlParameter("@CustomerID", SqlDbType.Int)) sqlCommand.Parameters("@CustomerID").Value = Me.parsedCustomerID ' Add the @OrderDate parameter. sqlCommand.Parameters.Add(New SqlParameter("@OrderDate", SqlDbType.DateTime, 8)) sqlCommand.Parameters("@OrderDate").Value = dtpOrderDate.Value ' Add the @Amount parameter. sqlCommand.Parameters.Add(New SqlParameter("@Amount", SqlDbType.Int)) sqlCommand.Parameters("@Amount").Value = numOrderAmount.Value ' Add the @Status 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 a return value parameter for the stored procedure, which is the orderID. 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. Me.orderID = CInt(sqlCommand.Parameters("@RC").Value) MessageBox.Show("Order number " & (Me.orderID).ToString & " has been submitted.") Catch ' A simple catch. MessageBox.Show("Order could not be placed.") Finally ' Always close a connection after you finish using it, ' so that it can be released to the connection pool. connection.Close() End Try End Using End Using End If End Sub ''' ''' Resets the form for another new account. ''' Private Sub btnAddAnotherAccount_Click(sender As Object, e As EventArgs) Handles btnAddAnotherAccount.Click Me.ClearForm() End Sub ''' ''' Closes the NewCustomer form and returns focus to the Navigation form. ''' Private Sub btnAddFinish_Click(sender As Object, e As EventArgs) Handles btnAddFinish.Click Me.Close() End Sub
Форма FillOrCancel
Форма FillOrCancel запускает запрос, чтобы вернуть заказ при вводе идентификатора заказа, а затем нажмите кнопку «Найти заказ «. Возвращенная строка отображается в сетке данных только для чтения. Вы можете пометить заказ как отмененный (X), если нажмите кнопку «Отмена заказа «, или вы можете пометить заказ как заполненный (F) при нажатии кнопки «Заказ заполнения «. Если снова выбрать кнопку «Найти заказ «, появится обновленная строка.
Создание обработчиков событий автоматического создания
Создайте пустые обработчики событий Click для четырех кнопок в форме FillOrCancel, дважды щелкнув кнопки. Дважды щелкнув кнопки, также добавляет автоматически созданный код в файл кода конструктора, который позволяет нажатию кнопки вызывать событие.
Добавление кода для логики формы FillOrCancel
Чтобы завершить логику формы FillOrCancel, выполните следующие действия.
Доведите следующие два пространства имен в область, чтобы вам не нужно полностью указать имена своих членов.
using System.Data.SqlClient; using System.Text.RegularExpressions;
Imports System.Data.SqlClient Imports System.Text.RegularExpressions
Добавьте в класс переменную и вспомогательный метод, как показано в следующем коде.
// Storage for the order ID value. private int parsedOrderID; /// /// Verifies that an order ID is present and contains valid characters. /// 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; >>
' Storage for OrderID. Private parsedOrderID As Integer ''' ''' Verifies that OrderID is valid. ''' Private Function IsOrderIDValid() As Boolean ' Check for input in the Order ID text box. If txtOrderID.Text = "" Then MessageBox.Show("Please specify the Order ID.") Return False ' Check for characters other than integers. ElseIf Regex.IsMatch(txtOrderID.Text, "^\D*$") Then ' Show message and clear input. MessageBox.Show("Please specify integers only.") 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 End If End Function
Заполните тела метода для четырех обработчиков событий нажатия кнопки, как показано в следующем коде.
////// Executes a t-SQL SELECT statement to obtain order data for a specified /// order ID, then displays it in the DataGridView on the form. /// 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(); >> > > > ////// Cancels an order by calling the Sales.uspCancelOrder /// stored procedure on the database. /// 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(); >> > > > ////// Fills an order by calling the Sales.uspFillOrder stored /// procedure on the database. /// 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(); >> > > > ////// Closes the form. /// private void btnFinishUpdates_Click(object sender, EventArgs e)
''' ''' Executes a t-SQL SELECT query on the database to ''' obtain order data for a specified order ID. ''' Private Sub btnFindByOrderID_Click(sender As Object, e As EventArgs) Handles btnFindByOrderID.Click ' Prepare the connection and the command. If IsOrderIDValid() Then ' Create the connection. Using connection As New SqlConnection(My.Settings.connString) ' Define the query string that has a parameter for orderID. Const sql As String = "select * from Sales.Orders where orderID = @orderID" ' Create a SqlCommand object. Using sqlCommand As New SqlCommand(sql, connection) ' Define the @orderID parameter and its value. sqlCommand.Parameters.Add(New SqlParameter("@orderID", SqlDbType.Int)) sqlCommand.Parameters("@orderID").Value = parsedOrderID Try ' Open connection. connection.Open() ' Execute the query. Dim dataReader As SqlDataReader = sqlCommand.ExecuteReader() ' Create a data table to hold the retrieved data. Dim dataTable As 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. Me.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() End Try End Using End Using End If End Sub ''' ''' Fills an order by running the Sales.uspFillOrder stored procedure on the database. ''' Private Sub btnFillOrder_Click(sender As Object, e As EventArgs) Handles btnFillOrder.Click ' Set up and run stored procedure only if OrderID is valid. If IsOrderIDValid() Then ' Create the connection. Using connection As New SqlConnection(My.Settings.connString) ' Create command and identify it as a stored procedure. Using sqlCommand As New SqlCommand("Sales.uspFillOrder", connection) sqlCommand.CommandType = CommandType.StoredProcedure ' Add input parameter for the stored procedure. sqlCommand.Parameters.Add(New SqlParameter("@orderID", SqlDbType.Int)) sqlCommand.Parameters("@orderID").Value = parsedOrderID ' Add second input parameter. sqlCommand.Parameters.Add(New SqlParameter("@FilledDate", SqlDbType.DateTime, 8)) sqlCommand.Parameters("@FilledDate").Value = dtpFillDate.Value Try ' Open the connection. connection.Open() ' Run the SqlCommand. sqlCommand.ExecuteNonQuery() Catch ' A simple catch. MessageBox.Show("The fill operation was not completed.") Finally ' Close the connection. connection.Close() End Try End Using End Using End If End Sub ''' ''' Cancels an order by running the Sales.uspCancelOrder stored procedure on the database. ''' Private Sub btnCancelOrder_Click(sender As Object, e As EventArgs) Handles btnCancelOrder.Click ' Set up and run the stored procedure only if OrderID is ready. If IsOrderIDValid() Then ' Create the connection. Using connection As New SqlConnection(My.Settings.connString) ' Create the command and identify it as a stored procedure. Using sqlCommand As New SqlCommand("Sales.uspCancelOrder", connection) sqlCommand.CommandType = CommandType.StoredProcedure ' Add 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 SqlCommand. sqlCommand.ExecuteNonQuery() Catch ' A simple catch. MessageBox.Show("The cancel operation was not completed.") Finally ' Close connection. connection.Close() End Try End Using End Using End If End Sub ''' ''' Closes the form and returns focus to the Navigation form. ''' Private Sub btnFinishUpdates_Click(sender As Object, e As EventArgs) Handles btnFinishUpdates.Click Me.Close() End Sub
Тестирование приложения
Запустите приложение и попробуйте создать несколько клиентов и заказов, чтобы убедиться, что все работает должным образом. Чтобы убедиться, что база данных обновлена с изменениями, откройте узел таблиц на сервере Обозреватель, щелкните правой кнопкой мыши узлы «Клиенты и заказы» и выберите «Показать данные таблицы».
См. также
Как сделать базу данных в visual studio c
Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core
Последнее обновление: 31.10.2015
Чтобы хранить данные, нам естественным образом нужна база данных. Как правило, в качестве базы данных используется MS SQL Server, на примере которого мы и посмотрим весь процесс создания БД и подключения к ней.
Мы можем создать базу данных прямо в проекте, либо же создать ее на сервере MS SQL. Для хранения баз данных проекте у нас предназначена папка App_Data. Для этого нажмем правой кнопкой мыши на папку App_Data и в появившемся контекстном меню выберем Add-> New Item. . В появившемся окне добавления нового элемента выберем SQL Server Database и назовем новую базу данных Bookstore.mdf:

Мы можем создать базу данных равнозначным образом и на сервере. После этого база данных добавляется в проект, и мы можем увидеть ее в папке App_Data. Теперь в обозревателе баз данных (окно Database Explorer ) мы можем подключиться к ней и создать таблицы, которые будут хранить данные.
Раскроем узел Bookstore.mdf и найдем узел Tables. Нажмем на этот узел правой кнопкой мыши и в появившемся меню выберем пункт Add New Table . И перед нами появится окно, в котором нам надо определить названия и типы столбцов новой таблицы. По соглашениям о наименованиях таблицы при работе с Entity Framework должны соответствовать имени модели. То есть, так как наша модель называется Book , то таблица будет называться Books . А Entity Framework автоматически распознает, что таблица Books соответствует классу Book .
Итак, создадим структуру таблицы:

Не забудьте установить ниже в окне Properties (в Visual Stidio 2010 — окно Column Properties) для столбца Id соответствующие параметры для первичного ключа:

После этого, если мы работаем с Visual Studio 2010, нам будет предложено просто ввести имя таблицы — введем имя Books, и затем таблица добавляется в БД.
А в Visual Studio Express 2012 for Web нам надо сгенерировать таблицу на основе заданного выше определения. Для этого нажмем на кнопку Update:

В появившемся диалоговом окне нажмем на кнопку Update Database. После этого в нашу базу данных добавляется только что сгенерированная таблица. Подобным образом определим таблицу Purchases для модели Purchase:

Добавим в таблицу Books несколько записей:

Теперь, во-первых, чтобы взаимодействовать с БД, нам нужен класс контекста данных, пусть это будет следующий класс BookContext:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Data.Entity; namespace BookStore.Models < public class BookContext : DbContext < public DbSetBooks < get; set; >public DbSet Purchases < get; set; >> >
Во-вторых, определим строку подключения к БД. Для этого откроем файл Web.config и добавим в конец секции configuration определение строки подключения. Однако тут надо сразу заметить, что для Visual Studio 2010 строка подключения будет отличаться от строки подключения, которая используется в Visual Studio 2012.
Итак, строка подключения для Visual Studio 2010 будет выглядеть так:
Для Visual Studio 2012 будет выглядеть определение строки подключения будет выглядеть следующим образом:
В Visual Studio 2012 в отличие от 2010-й версии мы можем использовать режим LocalDB, который предназначен прежде всего для разработчиков, представляя некоторую упрощенную версию. Поэтому в данном случае в качестве источника данных используется (LocalDB)\v11.0.
Обратите внимание, что в обоих случаях свойство name=»BookContext» должно содержать название контекста данных.
Использование подстановки |DataDirectory| позволяет опустить полный физический путь к базе данных, которая хранится в папке App_Data.
Теперь мы можем получить содержимое таблицы Books в контроллере Home:
public class HomeController : Controller < BookContext db = new BookContext(); public ActionResult Index() < return View(db.Books); >>
И вывести данные в представлении Index.cshtml:
@model IEnumerable @ < Layout = "~/Views/Shared/_Layout.cshtml"; >Распродажа книг
@foreach (BookStore.Models.Book b in Model) < Название книги
Автор
Цена
> @b.Name
@b.Author
@b.Price
Купить
Закрытие подключения
Чтобы наверняка быть уверенным, что подключение к базе данных закрыто, следует вызывать метод Dispose у контекста данных:
protected override void Dispose(bool disposing)
Это переопределенная версия метода Dispose контроллера, которая вызывается при уничтожении объекта контроллера. В нее помещается вызов db.Dispose() , который уничтожает все связанные с контекстом данных ресурсы и подключения.
Приложение на C# + связка с MySQL базой данных
Привет всем кодерам! В этом мини-туториале мы с вами с нуля напишем десктопное приложение на С#, которое будет работать с базой данных. Это задание было дано учебной программой 11 класса НИШ ФМН г.Алматы.
Что мы будем для этого использовать?
- Среда программирования: Visual Studio 2017 (версия не имеет никакого значения)
- Языки: C# — для клиентской части приложения, MySQL — для работы с данными в базе данных нашего приложения
Что будет выполнять приложение?
Наше приложение будет добавлять, изменять, обновлять, удалять и запрашивать данные из базы данных каратистов. «А почему каратистов?» — спросите вы. Так потому что это самая родная для меня тема, вот и будем рассматривать данный пример.
Создание проекта
После того, как вы скачали Visual Studio себе на компьютер, вам следует создать проект.
Как это сделать?
Создать проект -> Visual C# -> Приложение Windows Forms -> *Выбираем название для проекта и его расположение* -> OK
Теперь у вас готов проект и можно приступать к работе!
Создание форм (Часть 1)
Теперь нам нужно создать графический интерфейс приложения через формы. Добавлять новые формы легко. Просто нажимаете правой кнопкой мыши на свой проект и выбираете «Добавить», как на скриншоте ниже:
Далее следует поработать над дизайном наших форм. Не будем сильно изощряться и сделаем максимально минималистичный дизайн:
Главное меню
Меню выбора
Меню выбора для редактирования
Форма для добавления нового пользователя
Так-с. Дальше пока что мы не пойдём, так как для начала нам нужно понять как всё будет работать. У нас есть форма для добавления каратиста, и нам еще нужны формы для создания запросов, для просмотра базы данных и для редактирования её. Но где сама база данных?
Её нет. Поэтому нам нужно немедленно её создать!
Создание базы данных
Переходим во вкладку «Средства» и выбираем «Подключиться к базе данных». Далее открывается окно «Добавить подключение», где в поле «Источник данных» мы выбираем «Файл базы данных Microsoft SQL Server (SqlClient)«. Даём любое название файлу базы данных, в нашем случае — «IOGKF_members». Далее нажимаем кнопку «ОК» и в левой стороне экрана видим, как у нас добавилась новая база данных.
Раскрываем директорию с нашей базой данных и видим самую первую папку «Таблицы» — она нас и интересует. Жмём по ней правой кнопкой мыши и нажимаем «Добавить новую таблицу».
Можно создать таблицу двумя путями: 1) Конструктором 2) Через SQL код
Если вам лень делать её самим, то скопируйте следующий SQL код и вставьте его в поле с кодом у таблицы:
CREATE TABLE [dbo].[Members] ( [member_id] INT NOT NULL, [last_name] VARCHAR (20) NULL, [first_name] VARCHAR (20) NULL, [age] INT NULL, [rank] VARCHAR (3) NULL, [rank_value] INT NULL, [sensei] VARCHAR (20) NULL, [dojo] VARCHAR (20) NULL, PRIMARY KEY CLUSTERED ([member_id] ASC) );
Коротко о типах данных в SQL
- varchar — тот же самый String, то есть строка (в скобках пишем её максимальную длину)
- int — целые числа
- binary — тот же самый boolean, то есть True or False, только в SQL — это 1 и 0 соответственно
null — указываем может ли переменная быть пустой, то есть не содержать информации
primary key — первичный ключ, в данном случае это member_id. Таким образом, все значения member_id уникальны
После того как вы создали таблицу, нужно её сохранить. Нажмите ctrl + s или просто закройте файл с таблицей после чего у вас появится сообщение о сохранении таблицы.
Ок, теперь у нас есть база данных и таблица, где будет храниться информация о каратистах.
Создание форм (Часть 2) + код
Давайте напишем программный код для добавления каратистов в нашу базу данных. В моём проекте эта форма называется Form5 (у неё надпись «Add User» в предыдущих скриншотах). В классе этой формы пишем следующее:
public string conString = "Data Source=(LocalDB)\\MSSQLLocalDB;AttachDbFilename=C:\\Users\\HP\\Desktop\\IOGKF\\IOGKF\\IOGKF_members.mdf;Integrated Security=True;Connect Timeout=30";
Здесь мы создали строковую переменную conString и присвоили ей значение строки подключения базы данных. Чтобы посмотреть вашу строку подключения нажмите правой кнопкой мыши по базе данных и выберите «Свойства»:
Теперь два раза нажимаем на кнопку «Add» в конструкторе нашей формы и таким образом открываем код, который будет выполняться при её нажатии. Вот код метода, который выполняется при нажатии:
private void button1_Click(object sender, EventArgs e) < SqlConnection con = new SqlConnection(conString); con.Open(); if(con.State == System.Data.ConnectionState.Open) < string q = "insert into Members(member_id, last_name, first_name," + " age, rank, rank_value, sensei, dojo)" + " values('" + textBox1.Text.ToString() + "','" + textBox2.Text.ToString() + "','" + textBox3.Text.ToString() + "','" + textBox4.Text.ToString() + "','" + comboBox2.Text.ToString() + "','" + comboBox1.Text.ToString() + "','" + comboBox3.Text.ToString() + "','" + textBox8.Text.ToString() + "') "; SqlCommand cmd = new SqlCommand(q, con); cmd.ExecuteNonQuery(); MessageBox.Show("Connection was successful!"); >con.Close(); >
Мы создаём объект con типа SqlConnection и если наша база данных подключена к приложению у нас будет выполняться код находящийся под блоком if. Там у нас сохранена SQL команда в строке q, которая позже передаётся в объект cmd типа SqlCommand, который позже выполняет функцию ExecuteNonQuery, которая выполняет данный SQL запрос. После при успешном выполнении в приложении выведется сообщение об успешном добавлении каратиста. Всё достаточно просто!
Кстати, как работают кнопки навигации в приложении, то есть для перехода между формами?
Вот держите пример кода, по этому шаблону они все и работают:
private void button3_Click(object sender, EventArgs e)
Далее давайте напишем код для формы с обычным просмотром базы данных. Допустим, что мы уже заполнили базу данных и она должна выглядить так при работе приложения:
Чтобы ��рийти к такому результату нам нужно добавить в нашу форму DataGridView, объект, который будет отображать таблицу. Сделать это очень просто, на скриншоте это видно:
В классе этой формы пишем следующее:
SqlConnection con = new SqlConnection("Data Source=(LocalDB)\\MSSQLLocalDB;AttachDbFilename=C:\\Users\\HP\\Desktop\\IOGKF\\IOGKF\\IOGKF_members.mdf;Integrated Security=True;Connect Timeout=30"); SqlCommand cmd; SqlDataAdapter adapt;
Что-то наподобии этой строчки у вас должно появиться автоматически в Load методе класса вашей формы:
this.membersTableAdapter.Fill(this.iOGKF_membersDataSet.Members);
Она заполняет DataGridView данными из таблицы. Теперь в этот же метод Load добавляем эти строчки кода. С помощью них база данных будет постоянно обновляться внешне:
con.Open(); DataTable dt = new DataTable(); adapt = new SqlDataAdapter("select * from Members", con); adapt.Fill(dt); dataGridView1.DataSource = dt; con.Close();
А как сделать так, чтобы каратисты показывались по определённым критериям? Здесь нам нужно делать уже SQL запрос, но о них информация будет чуть позже на канале. Создаём новую форму, добавляем DataGridView и несколько текстовых полей. Кто шарит в SQL, тот поймёт в чем смысл этой формы:
Пишем код в метод, который будет выполняться при нажатии на кнопку «Show»:
private void button1_Click(object sender, EventArgs e)
В принципе, алгоритм здесь тот же самый, но мы уже создаем отдельный DataSet — коллекцию неупорядоченных данных, которые позже будут отображаться в DataGridView. Сам же DataSet был заполнен теми данными, которые получились от SQL запроса.
Напоследок осталось одно из самых сложных — сделать форму с редактированием базы данных. Вот, как она выглядит:
Как всегда пишем эти строчки кода в класс формы:
public string conString = "Data Source=(LocalDB)\\MSSQLLocalDB;AttachDbFilename=C:\\Users\\HP\\Desktop\\IOGKF\\IOGKF\\IOGKF_members.mdf;Integrated Security=True;Connect Timeout=30"; SqlConnection con = new SqlConnection("Data Source=(LocalDB)\\MSSQLLocalDB;AttachDbFilename=C:\\Users\\HP\\Desktop\\IOGKF\\IOGKF\\IOGKF_members.mdf;Integrated Security=True;Connect Timeout=30"); SqlCommand cmd; SqlDataAdapter adapt;
А это, как я раньше писал, для постоянного внешнего обновления базы данных в DataGridView:
private void Form7_Load(object sender, EventArgs e)
Теперь мы начнём писать код для кнопок.
Код для добавления каратистов из таблицы:
private void button1_Click(object sender, EventArgs e) < if (textBox1.Text != "" && textBox2.Text != "" && textBox3.Text != "" && textBox4.Text != "" && textBox5.Text != "" && textBox6.Text != "" && textBox7.Text != "" && textBox8.Text != "") < cmd = new SqlCommand("insert into Members(member_id,last_name,first_name,age,rank,rank_value,sensei,dojo) values(@member_id,@last_name,@first_name,@age,@rank,@rank_value,@sensei,@dojo)", con); con.Open(); cmd.Parameters.AddWithValue("@member_id", textBox1.Text); cmd.Parameters.AddWithValue("@last_name", textBox2.Text); cmd.Parameters.AddWithValue("@first_name", textBox3.Text); cmd.Parameters.AddWithValue("@age", textBox4.Text); cmd.Parameters.AddWithValue("@rank", textBox5.Text); cmd.Parameters.AddWithValue("@rank_value", textBox6.Text); cmd.Parameters.AddWithValue("@sensei", textBox7.Text); cmd.Parameters.AddWithValue("@dojo", textBox8.Text); cmd.ExecuteNonQuery(); con.Close(); MessageBox.Show("Record Inserted Successfully"); DisplayData(); ClearData(); >else < MessageBox.Show("Please Provide Details!"); >>
Код для редактирования информации о каратистах:
private void button4_Click(object sender, EventArgs e) < if (textBox1.Text != "" && textBox2.Text != "" && textBox3.Text != "" && textBox4.Text != "" && textBox5.Text != "" && textBox6.Text != "" && textBox7.Text != "" && textBox8.Text != "") < cmd = new SqlCommand("update Members set member_id=@member_id,last_name=@last_name,first_name=@first_name,age=@age,rank=@rank,rank_value=@rank_value,sensei=@sensei,dojo=@dojo where member_id=@member_id", con); con.Open(); cmd.Parameters.AddWithValue("@member_id", textBox1.Text); cmd.Parameters.AddWithValue("@last_name", textBox2.Text); cmd.Parameters.AddWithValue("@first_name", textBox3.Text); cmd.Parameters.AddWithValue("@age", textBox4.Text); cmd.Parameters.AddWithValue("@rank", textBox5.Text); cmd.Parameters.AddWithValue("@rank_value", textBox6.Text); cmd.Parameters.AddWithValue("@sensei", textBox7.Text); cmd.Parameters.AddWithValue("@dojo", textBox8.Text); cmd.ExecuteNonQuery(); MessageBox.Show("Record Updated Successfully"); con.Close(); DisplayData(); ClearData(); >else < MessageBox.Show("Please Select Record to Update"); >>
Код для удаления каратистов из базы данных:
private void button5_Click(object sender, EventArgs e) < if (textBox1.Text != null) < cmd = new SqlCommand("delete Members where member_id=@member_id", con); con.Open(); cmd.Parameters.AddWithValue("@member_id", textBox1.Text); cmd.ExecuteNonQuery(); con.Close(); MessageBox.Show("Record Deleted Successfully!"); DisplayData(); ClearData(); >else < MessageBox.Show("Please Select Record to Delete"); >>
Весь код выше работает по алгоритму, который я объяснял выше: идёт соединение с базой данных, выполняется команда, добавляются параметры в эту команду из текстовых полей и далее выводится сообщение.
Как вы заметили везде вызываются 2 метода — DisplayData и ClearData. Вот код для них:
private void DisplayData() < con.Open(); DataTable dt = new DataTable(); adapt = new SqlDataAdapter("select * from Members", con); adapt.Fill(dt); dataGridView1.DataSource = dt; con.Close(); >private void ClearData()
Также надо написать код для метода, который будет вызываться при нажатии на header в DataGridView и будет заполнять текстовые поля. Header — эта та область DataGridView, при нажатии на которую будет выделяться вся информация о каратисте, соответственно эта информация будет добавляться в соответствующие текстовые поля, для удобного редактирования. Выглядит это так:
Но прежде чем добавить этот метод, нам необходимо создать обработчик нажатий (Event Handler). Добавляем его в конструктор нашей формы:
public Form7()
А вот теперь добавляем метод:
private void OnRowHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
Вот и всё! У нас почти готовая программа, тебе надо лишь чуть доработать её и добавить мелкие детали!
Если что, я добавил этот проект к себе в GitHub, поэтому весь код можно посмотреть именно там. Только осторожно, там очень много файлов в которых можно легко запутаться. Желаю тебе удачи! 😀
