Создание приложения простой данных с помощью ADO.NETCreate a simple data application by using ADO.NET

При создании приложения, которое работает в базе данных, можно выполнять основные задачи, такие как определение строк подключения, вставка данных и выполнения хранимых процедур.When you create an application that manipulates data in a database, you perform basic tasks such as defining connection strings, inserting data, and running stored procedures. Перечисленные в этом разделе, вы можете узнать, как взаимодействовать с базой данных из простого приложения Windows Forms «формы поверх данных» с помощью Visual C# или Visual Basic и ADO.NET.By following this topic, you can discover how to interact with a database from within a simple Windows Forms "forms over data" application by using Visual C# or Visual Basic and ADO.NET. Все технологии данных .NET, включая наборы данных, LINQ to SQL и Entity Framework — в конечном счете выполните действия, которые очень похожи тем, что показано в этой статье.All .NET data technologies—including datasets, LINQ to SQL, and Entity Framework—ultimately perform steps that are very similar to those shown in this article.

В этой статье демонстрируется простой способ получить данные из базы данных в виде быстро.This article demonstrates a simple way to get data out of a database in a fast manner. Если приложению для изменения данных без того нетривиальные способами и обновления базы данных, можно с помощью Entity Framework и привязка данных к автоматически синхронизировать элементы управления пользовательского интерфейса для изменения базовых данных.If your application needs to modify data in non-trivial ways and update the database, you should consider using Entity Framework and using data binding to automatically sync user interface controls to changes in the underlying data.

Важно!

Чтобы не усложнять код, он не включает обработку исключений для производства.To keep the code simple, it doesn't include production-ready exception handling.

Предварительные требованияPrerequisites

Для создания приложения вам потребуются следующие компоненты.To create the application, you'll need:

В этом разделе предполагается, что вы знакомы с базовыми функциями интегрированной среды разработки Visual Studio и можно создать приложение Windows Forms, добавить формы в проект, добавить кнопки и другие элементы управления в формах, набор свойств элементов управления, и код для простых событий.This topic assumes that you're familiar with the basic functionality of the Visual Studio IDE and can create a Windows Forms application, add forms to the project, put buttons and other controls on the forms, set properties of the controls, and code simple events. Если вам неудобно решать эти задачи, мы рекомендуем выполнить Приступая к работе с Visual C# и Visual Basic раздел, прежде чем приступать к этому руководству.If you aren't comfortable with these tasks, we suggest that you complete the Getting started with Visual C# and Visual Basic topic before you start this walkthrough.

Настройка образца базы данныхSet up the sample database

Создание образца базы данных, выполнив следующие действия:Create the sample database by following these steps:

  1. В Visual Studio откройте обозревателя серверов окна.In Visual Studio, open the Server Explorer window.

  2. Щелкните правой кнопкой мыши подключения к данным и выберите создать новую базу данных SQL Server.Right-click on Data Connections and choose Create New SQL Server Database.

  3. В имя_сервера текста введите (localdb) \mssqllocaldb.In the Server name text box, enter (localdb)\mssqllocaldb.

  4. В новое имя базы данных текста введите Sales, затем выберите ОК.In the New database name text box, enter Sales, then choose OK.

    Пустой Sales базы данных создается и добавляется к узлу подключения к данным в обозревателе серверов.The empty Sales database is created and added to the Data Connections node in Server Explorer.

  5. Щелкните правой кнопкой мыши Sales подключения данных и нажмите кнопку новый запрос.Right-click on the Sales data connection and select New Query.

    Откроется окно редактора запросов.A query editor window opens.

  6. Копировать сценарий продаж Transact-SQL в буфер обмена.Copy the Sales Transact-SQL script to your clipboard.

  7. Вставьте сценарий T-SQL в редакторе запросов, а затем выберите Execute кнопки.Paste the T-SQL script into the query editor, and then choose the Execute button.

    Через некоторое время выполнения запроса отобразятся и создания объектов базы данных.After a short time, the query finishes running and the database objects are created. База данных содержит две таблицы: клиенты и заказы.The database contains two tables: Customer and Orders. Эти таблицы не содержат данных изначально, но вы можете добавить данные, при запуске приложения, которое будет создано.These tables contain no data initially, but you can add data when you run the application that you'll create. База данных также содержит четыре простых хранимых процедур.The database also contains four simple stored procedures.

Создание форм и добавление элементов управленияCreate the forms and add controls

  1. Создание проекта для приложения Windows Forms и назовите его SimpleDataApp.Create a project for a Windows Forms application, and then name it SimpleDataApp.

    Visual Studio создаст проект и несколько файлов, включая пустую форму Windows с именем Form1.Visual Studio creates the project and several files, including an empty Windows form that's named Form1.

  2. Добавьте в проект две формы Windows, таким образом, чтобы он включал три формы и назначьте им следующие имена:Add two Windows forms to your project so that it has three forms, and then give them the following names:

    • НавигацияNavigation

    • NewCustomerNewCustomer

    • FillOrCancelFillOrCancel

  3. Для каждой формы добавьте текстовые поля, кнопки и другие элементы управления, которые отображаются на рисунках ниже.For each form, add the text boxes, buttons, and other controls that appear in the following illustrations. Для каждого элемента управления задайте свойства, указанные в таблицах.For each control, set the properties that the tables describe.

    Примечание

    Элементы управления "группа" и "надпись" обеспечивают большую ясность, но не используются в коде.The group box and the label controls add clarity but aren't used in the code.

    Форма навигацииNavigation form

    Диалоговое окно "Навигация"

Элементы управления формы навигацииControls for the Navigation form СвойстваProperties
КнопкаButton Name = btnGoToAddName = btnGoToAdd
КнопкаButton Name = btnGoToFillOrCancelName = btnGoToFillOrCancel
КнопкаButton Name = btnExitName = btnExit

Форма NewCustomerNewCustomer form

Добавление нового заказчика и размещение заказа

Элементы управления формы NewCustomerControls for the NewCustomer form СвойстваProperties
TextBoxTextBox Name = txtCustomerNameName = txtCustomerName
TextBoxTextBox Name = txtCustomerIDName = txtCustomerID

Readonly = TrueReadonly = True
КнопкаButton Name = btnCreateAccountName = btnCreateAccount
NumericUpDownNumericUpdown DecimalPlaces = 0DecimalPlaces = 0

Maximum = 5000Maximum = 5000

Name = numOrderAmountName = numOrderAmount
DateTimePickerDateTimePicker Format = ShortFormat = Short

Name = dtpOrderDateName = dtpOrderDate
КнопкаButton Name = btnPlaceOrderName = btnPlaceOrder
КнопкаButton Name = btnAddAnotherAccountName = btnAddAnotherAccount
КнопкаButton Name = btnAddFinishName = btnAddFinish

Форма FillOrCancelFillOrCancel form

заполнение или отмена заказов

Элементы управления формы FillOrCancelControls for the FillOrCancel form СвойстваProperties
TextBoxTextBox Name = txtOrderIDName = txtOrderID
КнопкаButton Name = btnFindByOrderIDName = btnFindByOrderID
DateTimePickerDateTimePicker Format = ShortFormat = Short

Name = dtpFillDateName = dtpFillDate
DataGridViewDataGridView Name = dgvCustomerOrdersName = dgvCustomerOrders

Readonly = TrueReadonly = True

RowHeadersVisible = FalseRowHeadersVisible = False
КнопкаButton Name = btnCancelOrderName = btnCancelOrder
КнопкаButton Name = btnFillOrderName = btnFillOrder
КнопкаButton Name = btnFinishUpdatesName = btnFinishUpdates

Сохранение строки подключенияStore the connection string

Когда приложение пытается открыть подключение к базе данных, оно должно иметь доступ к строке подключения.When your application tries to open a connection to the database, your application must have access to the connection string. Чтобы избежать ручного ввода строки в каждой форме, хранить строки в App.config файла в проекте и создать метод, который возвращает строку, при вызове метода из любой формы в приложении.To avoid entering the string manually on each form, store the string in the App.config file in your project, and create a method that returns the string when the method is called from any form in your application.

Строку подключения можно найти, щелкнув правой кнопкой мыши Sales подключение к данным в обозревателя серверов и выбрав свойства.You can find the connection string by right-clicking on the Sales data connection in Server Explorer and choosing Properties. Найдите ConnectionString свойства, затем с помощью Ctrl+объект, Ctrl+C выберите и скопируйте строку в буфер обмена.Locate the ConnectionString property, then use Ctrl+A, Ctrl+C to select and copy the string to the clipboard.

  1. Если вы используете C# в обозревателе решений, разверните свойства узел проекта, а затем откройте Settings.settings файл.If you're using C#, in Solution Explorer, expand the Properties node under the project, and then open the Settings.settings file. Если вы используете Visual Basic в обозревателе решений, нажмите кнопку Показать все файлы, разверните Мой проект узел, а затем откройте Settings.settings файл.If you're using Visual Basic, in Solution Explorer, click Show All Files, expand the My Project node, and then open the Settings.settings file.

  2. В имя столбца, введите connString.In the Name column, enter connString.

  3. В тип выберите (строка подключения).In the Type list, select (Connection String).

  4. В область выберите приложения.In the Scope list, select Application.

  5. В значение столбца, введите строку подключения (без каких-либо за пределами кавычки), а затем сохраните изменения.In the Value column, enter your connection string (without any outside quotes), and then save your changes.

Примечание

В реальном приложении, следует хранить строку подключения безопасно, как описано в разделе строки подключения и файлы конфигурации.In a real application, you should store the connection string securely, as described in Connection strings and configuration files.

Написание кода для формWrite the code for the forms

Этот раздел содержит краткий обзор того, что делает каждая форма.This section contains brief overviews of what each form does. Он также предоставляет код, который определяет базовую логику, при нажатии кнопки на форме.It also provides the code that defines the underlying logic when a button on the form is clicked.

Форма навигации открывается при запуске приложения.The Navigation form opens when you run the application. Добавить учетную запись кнопки открывает форму NewCustomer.The Add an account button opens the NewCustomer form. Заливки или Отмена заказов кнопка открывает форму FillOrCancel.The Fill or cancel orders button opens the FillOrCancel form. Выхода кнопки закрывает приложение.The Exit button closes the application.

Преобразование формы навигации в начальную формуMake the Navigation form the startup form

При использовании C#, в обозревателе решенийоткройте Program.cs, а затем измените Application.Run строки к этому: Application.Run(new Navigation());If you're using C#, in Solution Explorer, open Program.cs, and then change the Application.Run line to this: Application.Run(new Navigation());

Если вы используете Visual Basic в обозревателе решенийоткройте свойства выберите приложения , а затем выберите SimpleDataApp.Navigation в Начальная форма списка.If you're using Visual Basic, in Solution Explorer, open the Properties window, select the Application tab, and then select SimpleDataApp.Navigation in the Startup form list.

Создание обработчиков событий созданCreate auto-generated event handlers

Дважды щелкните три кнопки в форме навигации для создания пустых методов обработчиков событий.Double-click the three buttons on the Navigation form to create empty event handler methods. Также двойным щелчком кнопки добавляет автоматически созданный код в файл кода конструктора, позволяющую нажатие кнопки для вызова события.Double-clicking the buttons also adds auto-generated code in the Designer code file that enables a button click to raise an event.

Добавьте код для логики формы навигацииAdd code for the Navigation form logic

В кодовой странице формы навигации завершение тел методов для три кнопки щелкните обработчики событий как показано в следующем коде.In the code page for the Navigation form, complete the method bodies for the three button click event handlers as shown in the following code.

/// <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();
}
''' <summary>
''' Opens the NewCustomer form as a dialog box, which returns focus to the calling form when it closes.
''' </summary>  
Private Sub btnGoToAdd_Click(sender As Object, e As EventArgs) Handles btnGoToAdd.Click
    Dim frm As Form = New NewCustomer()
    frm.Show()
End Sub

''' <summary>
''' Opens the FillOrCancel form as a dialog box.
''' </summary>
Private Sub btnGoToFillOrCancel_Click(sender As Object, e As EventArgs) Handles btnGoToFillOrCancel.Click
    Dim frm As Form = New FillOrCancel()
    frm.ShowDialog()
End Sub

''' <summary>
''' Closes the application (not just the navigation form).
''' </summary>
Private Sub btnExit_Click(sender As Object, e As EventArgs) Handles btnExit.Click
    Me.Close()
End Sub

Форма NewCustomerNewCustomer form

При вводе имени клиента, а затем выберите создать учетную запись кнопки, форма NewCustomer создает учетную запись клиента и SQL Server возвращает значение идентификатора в качестве нового идентификатора клиента.When you enter a customer name and then select the Create Account button, the NewCustomer form creates a customer account, and SQL Server returns an IDENTITY value as the new customer ID. Затем можно разместить заказ для новой учетной записи, указав количество и дату заказа и выбрав заказать кнопки.You can then place an order for the new account by specifying an amount and an order date and selecting the Place Order button.

Создание обработчиков событий созданCreate auto-generated event handlers

Создать, щелкните пустой обработчик событий для каждой кнопки в форме NewCustomer, дважды щелкнув каждый из четырех кнопок.Create an empty Click event handler for each button on the NewCustomer form by double-clicking on each of the four buttons. Также двойным щелчком кнопки добавляет автоматически созданный код в файл кода конструктора, позволяющую нажатие кнопки для вызова события.Double-clicking the buttons also adds auto-generated code in the Designer code file that enables a button click to raise an event.

Добавьте код для логики формы NewCustomerAdd code for the NewCustomer form logic

Чтобы выполнить логику формы NewCustomer, выполните следующие действия.To complete the NewCustomer form logic, follow these steps.

  1. Перевести System.Data.SqlClient пространства имен в область таким образом, нет необходимости полностью уточнить имена его членов.Bring the System.Data.SqlClient namespace into scope so that you don't have to fully qualify the names of its members.

    using System.Data.SqlClient;
    
    Imports System.Data.SqlClient
    
  2. Добавьте некоторые переменные и вспомогательные методы в класс, как показано в следующем коде.Add some variables and helper methods to the class as shown in the following code.

    // 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;
    }
    
    ' Storage for ID values returned from the database.  
    Private parsedCustomerID As Integer
    Private orderID As Integer
    
    ''' <summary>
    ''' Verifies that the customer name text box is not empty.
    ''' </summary>
    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
    
    ''' <summary>
    ''' Verifies the order data is valid. 
    ''' </summary>
    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
    
    ''' <summary>
    ''' Clears values from controls.
    ''' </summary>
    Private Sub ClearForm()
        txtCustomerName.Clear()
        txtCustomerID.Clear()
        dtpOrderDate.Value = DateTime.Now
        numOrderAmount.Value = 0
        Me.parsedCustomerID = 0
    End Sub
    
  3. Завершение тел методов для четыре кнопки, щелкните обработчики событий как показано в следующем коде.Complete the method bodies for the four button click event handlers as shown in the following code.

    /// <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();
    }
    
    ''' <summary>
    ''' Creates a new account by executing the Sales.uspNewCustomer
    ''' stored procedure on the database.
    ''' </summary>
    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
    
    ''' <summary>
    ''' Places the order by executing the Sales.uspPlaceNewOrder
    ''' stored procedure on the database.
    ''' </summary>
    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
    
    ''' <summary>
    ''' Resets the form for another new account.
    ''' </summary>
    Private Sub btnAddAnotherAccount_Click(sender As Object, e As EventArgs) Handles btnAddAnotherAccount.Click
        Me.ClearForm()
    End Sub
    
    ''' <summary>
    ''' Closes the NewCustomer form and returns focus to the Navigation form.
    ''' </summary>
    Private Sub btnAddFinish_Click(sender As Object, e As EventArgs) Handles btnAddFinish.Click
        Me.Close()
    End Sub
    

Форма FillOrCancelFillOrCancel form

Форма FillOrCancel выполняет запрос на возврат заказа при вводе идентификатора заказа и нажатии Find Order кнопки.The FillOrCancel form runs a query to return an order when you enter an order ID and then click the Find Order button. Возвращенная строка отображается в сетке данных только для чтения.The returned row appears in a read-only data grid. Можно пометить заказ как отмененные (X), при выборе отменить заказ кнопки, или можно пометить заказ как выполненный (F) при выборе Fill Order кнопки.You can mark the order as canceled (X) if you select the Cancel Order button, or you can mark the order as filled (F) if you select the Fill Order button. При выборе Find Order кнопку еще раз, появится обновленная строка.If you select the Find Order button again, the updated row appears.

Создание обработчиков событий созданCreate auto-generated event handlers

Создайте пустые обработчики события нажатия для четырех кнопок в форму FillOrCancel двойным щелчком кнопки.Create empty Click event handlers for the four buttons on the FillOrCancel form by double-clicking the buttons. Также двойным щелчком кнопки добавляет автоматически созданный код в файл кода конструктора, позволяющую нажатие кнопки для вызова события.Double-clicking the buttons also adds auto-generated code in the Designer code file that enables a button click to raise an event.

Добавьте код для логики форму FillOrCancelAdd code for the FillOrCancel form logic

Чтобы выполнить логику форму FillOrCancel, выполните следующие действия.To complete the FillOrCancel form logic, follow these steps.

  1. Ввести следующие два пространства имен в область действия, таким образом, нет необходимости использовать полные имена их элементов.Bring the following two namespaces into scope so that you don't have to fully qualify the names of their members.

    using System.Data.SqlClient;
    using System.Text.RegularExpressions;
    
    Imports System.Data.SqlClient
    Imports System.Text.RegularExpressions
    
  2. Добавьте переменную и вспомогательный метод к классу, как показано в следующем коде.Add a variable and helper method to the class as shown in the following code.

    // 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;
        }
    }
    
    ' Storage for OrderID.  
    Private parsedOrderID As Integer
    
    ''' <summary>
    ''' Verifies that OrderID is valid.
    ''' </summary>
    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
    
  3. Завершение тел методов для четыре кнопки, щелкните обработчики событий как показано в следующем коде.Complete the method bodies for the four button click event handlers as shown in the following code.

    /// <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();
    }
    
    ''' <summary>
    ''' Executes a t-SQL SELECT query on the database to
    ''' obtain order data for a specified order ID.
    ''' </summary>
    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
    
    ''' <summary>
    ''' Fills an order by running the Sales.uspFillOrder stored procedure on the database.
    ''' </summary>
    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
    
    ''' <summary>
    ''' Cancels an order by running the Sales.uspCancelOrder stored procedure on the database.
    ''' </summary>
    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
    
    ''' <summary>
    ''' Closes the form and returns focus to the Navigation form.
    ''' </summary>
    Private Sub btnFinishUpdates_Click(sender As Object, e As EventArgs) Handles btnFinishUpdates.Click
        Me.Close()
    End Sub
    

Тестирование приложенияTest your application

Выберите F5 Чтобы выполнить сборку и тестирование приложения после кода каждый обработчик событий нажатия, а затем, после его написания.Select the F5 key to build and test your application after you code each Click event handler, and then after you finish coding.

См. такжеSee also