C#でのデータベース接続とクエリの実行方法を徹底解説

C#を使用してデータベースに接続し、SQLクエリを実行する方法について、ステップバイステップで解説します。本記事では、必要なツールや環境の準備から始まり、基本的な接続方法、クエリの実行、データの読み取り、挿入、更新、削除、エラーハンドリング、パフォーマンス最適化まで幅広くカバーします。初心者にも分かりやすく、実際のコード例を交えて説明するので、これを読めばC#でのデータベース操作に自信が持てるようになります。

目次

必要な環境とツール

C#でデータベース操作を行うためには、以下の環境とツールが必要です。

開発環境の準備

C#での開発にはVisual Studioが一般的です。最新版のVisual Studioをインストールし、.NET開発用のワークロードを設定します。Visual Studio Codeでも可能ですが、フル機能のVisual Studioがおすすめです。

データベースの準備

データベースとしては、SQL Server、MySQL、SQLiteなどを使用します。ここではSQL Serverを例に説明します。SQL Serverのインストールが済んでいない場合は、公式サイトからダウンロードしてインストールしてください。

必要なライブラリのインストール

C#でデータベースに接続するためのライブラリが必要です。NuGetパッケージマネージャーを使用して、以下のパッケージをインストールします:

  • System.Data.SqlClient (SQL Server用)
  • MySql.Data (MySQL用)
  • Microsoft.Data.Sqlite (SQLite用)

各データベースに応じたパッケージをインストールすることで、C#コードからデータベース操作が可能になります。


データベース接続の基本

C#でデータベースに接続するための基本的な手順とコマンドを紹介します。

接続文字列の設定

データベースに接続するためには、接続文字列を設定する必要があります。接続文字列には、データベースのサーバーアドレス、データベース名、ユーザー名、パスワードなどの情報が含まれます。例えば、SQL Serverへの接続文字列は以下のようになります:

string connectionString = "Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;";

SqlConnectionクラスを使用した接続

接続文字列が準備できたら、SqlConnectionクラスを使用してデータベースに接続します。以下は、基本的な接続方法の例です:

using System;
using System.Data.SqlClient;

class Program
{
    static void Main()
    {
        string connectionString = "Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;";

        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            try
            {
                connection.Open();
                Console.WriteLine("データベースに接続しました。");
            }
            catch (Exception ex)
            {
                Console.WriteLine("接続エラー: " + ex.Message);
            }
        }
    }
}

このコードでは、SqlConnectionオブジェクトを作成し、接続文字列を指定してデータベースに接続しています。usingステートメントを使用することで、接続が自動的にクローズされ、リソースが解放されます。

接続の確認

接続が成功すると、”データベースに接続しました。”というメッセージがコンソールに表示されます。接続エラーが発生した場合は、例外がキャッチされ、エラーメッセージが表示されます。


クエリの実行方法

C#でSQLクエリを実行する方法とその手順を詳細に解説します。

SQLコマンドの作成

データベースに対してSQLクエリを実行するには、SqlCommandクラスを使用します。以下のコードは、データベースからデータを選択する基本的なクエリの例です:

using System;
using System.Data.SqlClient;

class Program
{
    static void Main()
    {
        string connectionString = "Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;";

        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            try
            {
                connection.Open();
                string query = "SELECT * FROM Employees";

                using (SqlCommand command = new SqlCommand(query, connection))
                {
                    using (SqlDataReader reader = command.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            Console.WriteLine($"{reader["EmployeeID"]}, {reader["FirstName"]}, {reader["LastName"]}");
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("クエリエラー: " + ex.Message);
            }
        }
    }
}

この例では、SqlCommandオブジェクトを使用してSQLクエリを実行し、SqlDataReaderを使用して結果を読み取ります。

パラメータ化されたクエリ

SQLインジェクション攻撃を防ぐために、パラメータ化されたクエリを使用することが推奨されます。以下は、その例です:

using System;
using System.Data.SqlClient;

class Program
{
    static void Main()
    {
        string connectionString = "Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;";

        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            try
            {
                connection.Open();
                string query = "SELECT * FROM Employees WHERE Department = @department";

                using (SqlCommand command = new SqlCommand(query, connection))
                {
                    command.Parameters.AddWithValue("@department", "Sales");

                    using (SqlDataReader reader = command.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            Console.WriteLine($"{reader["EmployeeID"]}, {reader["FirstName"]}, {reader["LastName"]}");
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("クエリエラー: " + ex.Message);
            }
        }
    }
}

この例では、@departmentというパラメータを使用してクエリを実行し、安全にデータを取得しています。


データの読み取りと表示

実行したクエリ結果を読み取り、コンソールに表示する方法を紹介します。

データの読み取り

SQLクエリの結果を読み取るためには、SqlDataReaderクラスを使用します。以下の例では、データベースから従業員情報を取得し、コンソールに表示します:

using System;
using System.Data.SqlClient;

class Program
{
    static void Main()
    {
        string connectionString = "Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;";

        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            try
            {
                connection.Open();
                string query = "SELECT EmployeeID, FirstName, LastName FROM Employees";

                using (SqlCommand command = new SqlCommand(query, connection))
                {
                    using (SqlDataReader reader = command.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            int employeeId = reader.GetInt32(0);
                            string firstName = reader.GetString(1);
                            string lastName = reader.GetString(2);

                            Console.WriteLine($"ID: {employeeId}, 名前: {firstName} {lastName}");
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("クエリエラー: " + ex.Message);
            }
        }
    }
}

読み取ったデータの表示

上記の例では、reader.GetInt32(0)reader.GetString(1)といったメソッドを使用してデータを読み取り、それをコンソールに出力しています。readerオブジェクトのReadメソッドは、次の行が存在する間はtrueを返し、データを順次読み取ることができます。

データ型の取得

SqlDataReaderのメソッドを使用することで、特定のデータ型の値を取得できます。以下は一般的なデータ型の取得方法です:

  • GetInt32:整数型
  • GetString:文字列型
  • GetDateTime:日付型

これらのメソッドを使うことで、正しいデータ型で値を取得し、適切に処理することができます。


データの挿入・更新・削除

C#でデータベースにデータを挿入、更新、削除する方法について具体的な例を示します。

データの挿入

データベースに新しいレコードを挿入するには、INSERT文を使用します。以下の例では、新しい従業員のデータを挿入します:

using System;
using System.Data.SqlClient;

class Program
{
    static void Main()
    {
        string connectionString = "Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;";

        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            try
            {
                connection.Open();
                string query = "INSERT INTO Employees (FirstName, LastName, Department) VALUES (@firstName, @lastName, @department)";

                using (SqlCommand command = new SqlCommand(query, connection))
                {
                    command.Parameters.AddWithValue("@firstName", "John");
                    command.Parameters.AddWithValue("@lastName", "Doe");
                    command.Parameters.AddWithValue("@department", "Sales");

                    int result = command.ExecuteNonQuery();
                    Console.WriteLine($"{result} 行が挿入されました。");
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("挿入エラー: " + ex.Message);
            }
        }
    }
}

データの更新

既存のデータを更新するには、UPDATE文を使用します。以下の例では、従業員の部署情報を更新します:

using System;
using System.Data.SqlClient;

class Program
{
    static void Main()
    {
        string connectionString = "Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;";

        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            try
            {
                connection.Open();
                string query = "UPDATE Employees SET Department = @department WHERE EmployeeID = @employeeId";

                using (SqlCommand command = new SqlCommand(query, connection))
                {
                    command.Parameters.AddWithValue("@department", "Marketing");
                    command.Parameters.AddWithValue("@employeeId", 1);

                    int result = command.ExecuteNonQuery();
                    Console.WriteLine($"{result} 行が更新されました。");
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("更新エラー: " + ex.Message);
            }
        }
    }
}

データの削除

データを削除するには、DELETE文を使用します。以下の例では、従業員のレコードを削除します:

using System;
using System.Data.SqlClient;

class Program
{
    static void Main()
    {
        string connectionString = "Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;";

        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            try
            {
                connection.Open();
                string query = "DELETE FROM Employees WHERE EmployeeID = @employeeId";

                using (SqlCommand command = new SqlCommand(query, connection))
                {
                    command.Parameters.AddWithValue("@employeeId", 1);

                    int result = command.ExecuteNonQuery();
                    Console.WriteLine($"{result} 行が削除されました。");
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("削除エラー: " + ex.Message);
            }
        }
    }
}

これらの例では、SQLコマンドを作成し、適切なパラメータを設定することで、安全かつ効率的にデータの挿入、更新、削除が行えます。


例外処理とエラーハンドリング

データベース操作中のエラーを処理するための方法とベストプラクティスを解説します。

例外処理の基本

データベース操作中に発生する可能性のあるエラーを適切に処理するためには、try-catchブロックを使用します。以下の例では、接続エラーとクエリエラーをキャッチして処理しています:

using System;
using System.Data.SqlClient;

class Program
{
    static void Main()
    {
        string connectionString = "Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;";

        try
        {
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                connection.Open();
                string query = "SELECT * FROM Employees";

                using (SqlCommand command = new SqlCommand(query, connection))
                {
                    using (SqlDataReader reader = command.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            Console.WriteLine($"{reader["EmployeeID"]}, {reader["FirstName"]}, {reader["LastName"]}");
                        }
                    }
                }
            }
        }
        catch (SqlException sqlEx)
        {
            Console.WriteLine("SQLエラー: " + sqlEx.Message);
        }
        catch (InvalidOperationException invalidEx)
        {
            Console.WriteLine("無効な操作エラー: " + invalidEx.Message);
        }
        catch (Exception ex)
        {
            Console.WriteLine("一般的なエラー: " + ex.Message);
        }
    }
}

具体的なエラーハンドリング

異なる種類の例外に対して、具体的な処理を行うことが重要です。例えば、SqlExceptionはデータベースに関連するエラーを表し、InvalidOperationExceptionは無効な操作を表します。それぞれに対して適切なエラーメッセージを表示することで、問題の原因を特定しやすくなります。

ログの記録

エラー情報をログとして記録することで、後から問題を解析しやすくなります。以下は、エラーログをファイルに書き込む簡単な例です:

using System;
using System.Data.SqlClient;
using System.IO;

class Program
{
    static void Main()
    {
        string connectionString = "Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;";

        try
        {
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                connection.Open();
                string query = "SELECT * FROM Employees";

                using (SqlCommand command = new SqlCommand(query, connection))
                {
                    using (SqlDataReader reader = command.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            Console.WriteLine($"{reader["EmployeeID"]}, {reader["FirstName"]}, {reader["LastName"]}");
                        }
                    }
                }
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine("エラーが発生しました: " + ex.Message);
            File.AppendAllText("error.log", DateTime.Now + ": " + ex.ToString() + Environment.NewLine);
        }
    }
}

この例では、エラーが発生した際に、そのエラーメッセージを「error.log」ファイルに記録しています。これにより、発生した問題の履歴を追跡しやすくなります。


パフォーマンス最適化

データベースクエリのパフォーマンスを最適化するための方法を紹介します。

インデックスの使用

データベーステーブルにインデックスを追加することで、クエリの実行速度を大幅に向上させることができます。特に、頻繁に検索や結合が行われる列にはインデックスを設定しましょう。以下は、SQL Serverでインデックスを追加する例です:

CREATE INDEX idx_employee_department ON Employees(Department);

効率的なクエリの設計

クエリを設計する際は、できるだけシンプルかつ効率的にすることが重要です。例えば、不要な列を選択せず、必要なデータのみを取得するようにします。また、サブクエリを避け、JOINを活用することでパフォーマンスを向上させることができます。

例:シンプルなクエリ

string query = "SELECT FirstName, LastName FROM Employees WHERE Department = @department";

接続の再利用

データベース接続の確立には時間がかかるため、同じ接続を再利用することでパフォーマンスを向上させることができます。以下は、接続を効率的に再利用する例です:

using System;
using System.Data.SqlClient;

class Program
{
    static void Main()
    {
        string connectionString = "Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;";

        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            connection.Open();

            for (int i = 0; i < 10; i++)
            {
                string query = "SELECT FirstName, LastName FROM Employees WHERE EmployeeID = @employeeId";

                using (SqlCommand command = new SqlCommand(query, connection))
                {
                    command.Parameters.AddWithValue("@employeeId", i);

                    using (SqlDataReader reader = command.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            Console.WriteLine($"{reader["FirstName"]}, {reader["LastName"]}");
                        }
                    }
                }
            }
        }
    }
}

バッチ処理の活用

大量のデータを処理する場合、バッチ処理を使用することでパフォーマンスを向上させることができます。以下は、バッチ処理の例です:

using System;
using System.Data.SqlClient;

class Program
{
    static void Main()
    {
        string connectionString = "Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;";

        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            connection.Open();

            string query = "INSERT INTO Employees (FirstName, LastName, Department) VALUES (@firstName, @lastName, @department)";

            using (SqlCommand command = new SqlCommand(query, connection))
            {
                for (int i = 0; i < 100; i++)
                {
                    command.Parameters.Clear();
                    command.Parameters.AddWithValue("@firstName", "John" + i);
                    command.Parameters.AddWithValue("@lastName", "Doe" + i);
                    command.Parameters.AddWithValue("@department", "Sales");

                    command.ExecuteNonQuery();
                }
            }
        }
    }
}

この例では、ループ内で複数の挿入操作を一つの接続で行い、パフォーマンスを向上させています。


応用例と演習問題

学んだ内容を活用するための応用例と実践的な演習問題を提供します。

応用例:顧客管理システム

ここでは、C#で簡単な顧客管理システムを構築する例を紹介します。このシステムでは、顧客情報の追加、表示、更新、および削除が可能です。

顧客テーブルの作成

まず、SQL Serverで以下のスクリプトを実行して顧客テーブルを作成します:

CREATE TABLE Customers (
    CustomerID INT PRIMARY KEY IDENTITY,
    FirstName NVARCHAR(50),
    LastName NVARCHAR(50),
    Email NVARCHAR(50),
    Phone NVARCHAR(15)
);

顧客の追加

以下のコードは、新しい顧客をデータベースに追加する方法を示します:

using System;
using System.Data.SqlClient;

class Program
{
    static void Main()
    {
        string connectionString = "Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;";

        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            connection.Open();

            string query = "INSERT INTO Customers (FirstName, LastName, Email, Phone) VALUES (@firstName, @lastName, @Email, @Phone)";

            using (SqlCommand command = new SqlCommand(query, connection))
            {
                command.Parameters.AddWithValue("@firstName", "Jane");
                command.Parameters.AddWithValue("@lastName", "Smith");
                command.Parameters.AddWithValue("@Email", "jane.smith@example.com");
                command.Parameters.AddWithValue("@Phone", "123-456-7890");

                int result = command.ExecuteNonQuery();
                Console.WriteLine($"{result} 行が挿入されました。");
            }
        }
    }
}

顧客情報の表示

以下のコードは、顧客情報を読み取り、表示する方法を示します:

using System;
using System.Data.SqlClient;

class Program
{
    static void Main()
    {
        string connectionString = "Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;";

        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            connection.Open();

            string query = "SELECT * FROM Customers";

            using (SqlCommand command = new SqlCommand(query, connection))
            {
                using (SqlDataReader reader = command.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        Console.WriteLine($"{reader["CustomerID"]}, {reader["FirstName"]}, {reader["LastName"]}, {reader["Email"]}, {reader["Phone"]}");
                    }
                }
            }
        }
    }
}

演習問題

これまで学んだ内容を基に、以下の演習問題に取り組んでみてください。

演習1: データの更新

顧客のメールアドレスを更新するプログラムを作成してください。

演習2: データの削除

顧客情報を削除するプログラムを作成してください。

演習3: 検索機能の実装

顧客の名前を入力して検索し、一致する顧客情報を表示するプログラムを作成してください。

演習4: パフォーマンスの最適化

大量の顧客データを効率的に挿入する方法を実装し、そのパフォーマンスを測定してみてください。


まとめ

C#でのデータベース接続とクエリ実行の基本について学びました。必要な環境の準備から、データの挿入・更新・削除、例外処理、パフォーマンス最適化まで、一連の流れを理解することができました。実際のコード例を用いて説明しましたので、実践的なスキルを身に付けることができたと思います。今後は、提供した応用例や演習問題に取り組むことで、さらに理解を深め、実務での応用力を高めてください。これでC#を使用したデータベース操作に自信を持って取り組めるはずです。

コメント

コメントする

目次