ADO.NET を使用した単純なデータ アプリケーションの作成

データベースのデータを処理するアプリケーションの作成では、接続文字列の定義、データの挿入、ストアド プロシージャの実行などの基本的なタスクを実行します。 このトピックでは、Visual C# または Visual Basic と ADO.NET を使用して、単純な Windows フォームの "フォーム オーバー データ" アプリケーション内からデータベースと対話する方法について説明します。 データセット、LINQ to SQL、Entity Framework を含むすべての .NET データ テクノロジでは、最終的にこの記事に記載されている手順とよく似た手順を実行します。

この記事では、迅速な方法でデータベースからデータを取得する簡単な方法を示します。 アプリケーションで複雑な方法でデータを変更し、データベースを更新する必要がある場合は、Entity Framework の使用や、データ バインディングを使用して、基になるデータの変更にユーザー インターフェイス コントロールを自動的に同期することを検討してください。

重要

コードをシンプルにするため、運用環境で使用する例外処理は含まれていません。

必須コンポーネント

アプリケーションの作成には、次が必要です:

このトピックは、Visual Studio IDE の基本的な機能を理解していて、Windows フォーム アプリケーションの作成、そのプロジェクトへのフォームの追加、フォームへのボタンなどのコントロールの追加、コントロールのプロパティの設定、およびシンプルなイベントのコード記述ができることを前提としています。 これらのタスクに慣れていない場合は、このチュートリアルを開始する前に、Visual C# と Visual Basic の概要に関するトピックを完了することをお勧めします。

サンプル データベースを設定する

次の手順に従ってサンプル データベースを作成します。

  1. Visual Studio で、 [サーバー エクスプローラー] ウィンドウを開きます。

  2. [データ接続] を右クリックし、 [新しい SQL Server データベースの作成] を選択します。

  3. [サーバー名] テキスト ボックスに「 (localdb)\mssqllocaldb」と入力します。

  4. [新しいデータベース名] テキスト ボックスに「Sales」と入力し、 [OK] を選択します。

    空の Sales データベースが作成され、サーバー エクスプローラーの [データ接続] ノードに追加されます。

  5. Sales データ接続を右クリックし、 [新しいクエリ] を選択します。

    クエリ エディター ウィンドウが開きます。

  6. Sales Transact-SQL スクリプトをクリップボードにコピーします。

  7. T-SQL スクリプトをクエリ エディターに貼り付け、 [実行] ボタンを選択します。

    しばらくすると、クエリの実行が完了し、データベース オブジェクトが作成されます。 データベースには、Customer と Orders という 2 つのテーブルが含まれています。 最初はテーブルにデータはありませんが、作成したアプリケーションを実行してデータを追加できます。 データベースには、4 種類のシンプルなストアド プロシージャもあります。

フォームを作成してコントロールを追加する

  1. Windows フォーム アプリケーションのプロジェクトを作成し、SimpleDataApp という名前を付けます。

    Visual Studio は、Form1 という名前の空の Windows フォームを含めた、いくつかのファイルとプロジェクトを作成します。

  2. 2 つの Windows フォームをプロジェクトに追加し、合計 3 つのフォームに次の名前を付けます。

    • ナビゲーション

    • NewCustomer

    • FillOrCancel

  3. 各フォームに、次の図に示されるように、テキスト ボックス、ボタン、および他のコントロールを追加します。 各コントロールに、テーブルを示すプロパティを設定します。

    注意

    グループ ボックス、およびラベル コントロールは明確性を追加しますが、コードでは使用されません。

    Navigation フォーム

    ナビゲーション ダイアログ ボックス

Navigation フォームのコントロール プロパティ
ボタン Name = btnGoToAdd
ボタン Name = btnGoToFillOrCancel
ボタン Name = btnExit

NewCustomer フォーム

新しい顧客を追加して注文を作成する

NewCustomer フォームのコントロール プロパティ
TextBox Name = txtCustomerName
TextBox Name = txtCustomerID

Readonly = True
ボタン Name = btnCreateAccount
NumericUpdown DecimalPlaces = 0

Maximum = 5000

Name = numOrderAmount
DateTimePicker Format = Short

Name = dtpOrderDate
ボタン Name = btnPlaceOrder
ボタン Name = btnAddAnotherAccount
ボタン Name = btnAddFinish

FillOrCancel フォーム

注文の入力または取り消し

FillOrCancel フォームのコントロール プロパティ
TextBox Name = txtOrderID
ボタン Name = btnFindByOrderID
DateTimePicker Format = Short

Name = dtpFillDate
DataGridView Name = dgvCustomerOrders

Readonly = True

RowHeadersVisible = False
ボタン Name = btnCancelOrder
ボタン Name = btnFillOrder
ボタン Name = btnFinishUpdates

接続文字列を保存する

アプリケーションがデータベースの接続を開くとき、アプリケーションは接続文字列にアクセスする必要があります。 各フォームで文字列を手動で入力することを回避するため、プロジェクトの App.config ファイルに文字列を保存し、アプリケーションの任意のフォームから呼び出された場合にこの文字列を返すメソッドを作成します。

接続文字列を見つけるには、サーバー エクスプローラーSales データ接続を右クリックし、 [プロパティ] を選択します。 ConnectionString プロパティを見つけ、Ctrl+A キーを使用して文字列を選択し、Ctrl+C キーを使用してクリップボードにコピーします。

  1. C# を使用している場合は、ソリューション エクスプローラー で、プロジェクトの [プロパティ] ノードを展開し、Settings.settings ファイルを開きます。 Visual Basic を使用している場合は、ソリューション エクスプローラー[すべてのファイルを表示] をクリックし、 [My Project] ノードを展開して、Settings.settings ファイルを開きます。

  2. [名前] 列に、「connString」と入力します。

  3. [種類] ボックスの一覧にある [(接続文字列)] を選択します。

  4. [スコープ] ボックスの一覧にある [アプリケーション] を選択します。

  5. [値] 列に、(引用符を除く) 接続文字列を入力し、変更を保存します。

注意

実際のアプリケーションでは、「接続文字列と構成ファイル」で説明されているように、接続文字列を安全に保存する必要があります。

フォームのコードを記述する

このセクションでは、各フォームの動作の概要を簡単に説明します。 また、フォーム上のボタンをクリックしたときの内部ロジックを定義するコードも提供します。

Navigation フォームはアプリケーションを実行すると開きます。 [Add an account] ボタンは NewCustomer フォームを開きます。 [Fill or cancel orders] ボタンは FillOrCancel フォームを開きます。 [Exit] ボタンは、アプリケーションを閉じます。

Navigation フォームをスタートアップ フォームに設定

C# を使用している場合、ソリューション エクスプローラーProgram.cs を開き、Application.Run の行を Application.Run(new Navigation()); に変更します。

Visual Basic を使用している場合、ソリューション エクスプローラー で、 [プロパティ] ウィンドウを開き、 [アプリケーション] タブを選択して、 [スタートアップ フォーム] の一覧から SimpleDataApp.Navigation を選択します。

自動生成されたイベント ハンドラーを作成する

Navigation フォームの 3 つのボタンをダブルクリックして、空のイベント ハンドラー メソッドを作成します。 また、ボタンをダブルクリックすると、デザイナーのコード ファイルに自動生成されたコードが追加され、ボタンをクリックしてイベントを発生させることができます。

Navigation フォーム ロジックのコードを追加する

Navigation フォームのコード ページで、次のコードに示すように、3 つのボタン クリック イベント ハンドラーのメソッド本体を完成させます。

/// <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

NewCustomer フォーム

顧客名を入力し [Create Account] ボタンを選択すると、NewCustomer フォームは、顧客アカウントを作成し、SQL Server は新しい顧客 ID として IDENTITY 値を返します。 数量と注文日を指定して [Place Order] ボタンを選択すると、この新しいアカウントの注文を設定できます。

自動生成されたイベント ハンドラーを作成する

4 つのボタンをそれぞれダブルクリックして、NewCustomer フォームの各ボタンに空のクリック イベント ハンドラーを作成します。 また、ボタンをダブルクリックすると、デザイナーのコード ファイルに自動生成されたコードが追加され、ボタンをクリックしてイベントを発生させることができます。

NewCustomer フォーム ロジックのコードを追加する

NewCustomer フォーム ロジックを完成させるには、次の手順を実行します。

  1. System.Data.SqlClient 名前空間をスコープ内に入れて、メンバーの名前を完全修飾する必要がないようにします。

    using System.Data.SqlClient;
    
    Imports System.Data.SqlClient
    
  2. 次のコードに示すように、クラスにいくつかの変数とヘルパー メソッドを追加します。

    // 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. 次のコードに示すように、4 つのボタン クリック イベント ハンドラーのメソッド本体を完成させます。

    /// <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
    

FillOrCancel フォーム

FillOrCancel フォームは、Order ID (注文 ID) を入力して [Find Order] のボタンをクリックしたときに、Order (注文) を戻すクエリを実行します。 戻された行は読み取り専用なデータ グリッドに表示されます。 [Cancel Order] ボタンを選択すると、注文をキャンセル (X) としてマークできます。また [Fill Order] ボタンを選択すると、注文を満たした (F) としてマークできます。 [Find Order] ボタンをもう一度選択すると、更新された行が表示されます。

自動生成されたイベント ハンドラーを作成する

ボタンをダブルクリックして、FillOrCancel フォームの 4 つのボタンに空のクリック イベント ハンドラーを作成します。 また、ボタンをダブルクリックすると、デザイナーのコード ファイルに自動生成されたコードが追加され、ボタンをクリックしてイベントを発生させることができます。

FillOrCancel フォーム ロジックのコードを追加する

FillOrCancel フォーム ロジックを完成させるには、次の手順を実行します。

  1. 次の 2 つの名前空間をスコープ内に入れて、メンバーの名前を完全修飾する必要がないようにします。

    using System.Data.SqlClient;
    using System.Text.RegularExpressions;
    
    Imports System.Data.SqlClient
    Imports System.Text.RegularExpressions
    
  2. 次のコードに示すように、クラスに変数とヘルパー メソッドを追加します。

    // 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. 次のコードに示すように、4 つのボタン クリック イベント ハンドラーのメソッド本体を完成させます。

    /// <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
    

アプリケーションのテスト

各クリック イベント ハンドラーをコードし、コードの記述を完了した後、F5 キーを押してアプリケーションのビルドとテストを実行します。

関連項目