カテゴリ: C# 更新日: 2026/02/10

C#のADO.NETの基礎!SqlConnectionとSqlCommandの使い方を初心者向けに徹底解説

C#のADO.NETの基礎!SqlConnectionとSqlCommandの使い方
C#のADO.NETの基礎!SqlConnectionとSqlCommandの使い方

先生と生徒の会話形式で理解しよう

生徒

「C#でデータベースに接続して、データを取得したり保存したりする方法ってありますか?」

先生

「はい、C#ではADO.NETという技術を使って、データベース操作が簡単にできます。特にSqlConnectionとSqlCommandというクラスが重要になります。」

生徒

「ADO.NETって何ですか?初めて聞きました。」

先生

「ADO.NETは、データベースとC#プログラムを繋ぐ橋のようなものです。今日は基本的な使い方から、実際のコード例まで詳しく見ていきましょう!」

1. ADO.NETとは?データベース操作の基礎知識

1. ADO.NETとは?データベース操作の基礎知識
1. ADO.NETとは?データベース操作の基礎知識

ADO.NET(ActiveX Data Objects .NET)は、C#などの.NET言語でデータベースを操作するための技術です。データベースとは、大量の情報を整理して保管しておく場所のことで、例えるなら巨大な図書館のようなものです。本棚に本が整理されているように、データベースには顧客情報や商品情報などが整理されて保存されています。

ADO.NETを使うことで、C#プログラムからデータベースに接続し、データの取得、追加、更新、削除といった操作ができるようになります。これらの操作はCRUD操作(Create・Read・Update・Delete)と呼ばれ、データベースを扱う上で最も基本的な処理です。

ADO.NETには様々なクラスがありますが、今回は最も基本となるSqlConnectionSqlCommandについて学習していきます。これらはMicrosoft SQL Serverというデータベースシステムを操作する際に使用するクラスです。

2. SqlConnectionクラスとは?データベース接続の仕組み

2. SqlConnectionクラスとは?データベース接続の仕組み
2. SqlConnectionクラスとは?データベース接続の仕組み

SqlConnectionクラスは、C#プログラムとSQL Serverデータベースを繋ぐための「接続」を表すクラスです。これは電話をかけるときに回線を繋ぐようなイメージです。電話で話すには相手と回線を繋げる必要があるように、データベースを操作するにはまずデータベースとの接続を確立する必要があります。

SqlConnectionを使うには、まず接続文字列(Connection String)というものが必要です。接続文字列には、どのサーバーのどのデータベースに、どのような認証方法で接続するかという情報が含まれています。これは住所のようなもので、正確な情報がないと目的地(データベース)にたどり着けません。

接続文字列の基本的な構成要素は以下の通りです:

  • Server:データベースサーバーの名前やIPアドレス
  • Database:接続先のデータベース名
  • User ID / Password:認証に使用するユーザー名とパスワード
  • Integrated Security:Windows認証を使用する場合に指定

3. SqlConnectionの基本的な使い方とコード例

3. SqlConnectionの基本的な使い方とコード例
3. SqlConnectionの基本的な使い方とコード例

それでは実際にSqlConnectionを使ってデータベースに接続するコードを見てみましょう。以下は最もシンプルな接続例です。


using System;
using System.Data.SqlClient;

class Program
{
    static void Main()
    {
        // 接続文字列を定義
        string connectionString = "Server=localhost;Database=TestDB;Integrated Security=True;";
        
        // SqlConnectionオブジェクトを作成
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            // データベースに接続
            connection.Open();
            Console.WriteLine("データベースに接続しました!");
            
            // ここでデータベース操作を行う
            
            // 接続は自動的に閉じられる(usingブロックの終了時)
        }
        
        Console.WriteLine("データベース接続が閉じられました。");
    }
}

このコードでは、usingステートメントを使用しています。usingステートメントは、リソース(ここではデータベース接続)を使い終わったら自動的に解放してくれる便利な仕組みです。これは電話を切り忘れないようにする自動切断機能のようなものです。

connection.Open()メソッドを呼び出すことで、実際にデータベースへの接続が確立されます。接続が成功すると、データベースに対して様々な操作ができるようになります。usingブロックを抜けると、自動的に接続が閉じられるため、接続のし忘れによるリソースの無駄遣いを防げます。

4. SqlCommandクラスとは?SQL文を実行する仕組み

4. SqlCommandクラスとは?SQL文を実行する仕組み
4. SqlCommandクラスとは?SQL文を実行する仕組み

SqlCommandクラスは、データベースに対して実行するSQL文(命令文)を表すクラスです。データベースに接続しただけでは何もできません。実際にデータを取得したり、追加したりするには、データベースに「これをしてください」という指示を出す必要があります。その指示がSQL文であり、それを実行するのがSqlCommandです。

SQL文とは、データベースを操作するための専用言語です。例えば、「SELECT」はデータを取得する命令、「INSERT」はデータを追加する命令、「UPDATE」はデータを更新する命令、「DELETE」はデータを削除する命令です。これらの命令をSqlCommandに設定して実行することで、データベース操作が実現できます。

SqlCommandには主に3つの実行メソッドがあります:

  • ExecuteNonQuery():INSERT、UPDATE、DELETEなど、結果を返さない操作に使用
  • ExecuteScalar():単一の値(1つのデータ)を取得する場合に使用
  • ExecuteReader():複数行のデータを取得する場合に使用

5. データを取得する - ExecuteReaderの使い方

5. データを取得する - ExecuteReaderの使い方
5. データを取得する - ExecuteReaderの使い方

データベースから複数行のデータを取得する場合は、ExecuteReader()メソッドを使用します。これは図書館で複数の本を借りるようなイメージです。以下のコードでは、顧客テーブルから全ての顧客情報を取得しています。


using System;
using System.Data.SqlClient;

class Program
{
    static void Main()
    {
        string connectionString = "Server=localhost;Database=SalesDB;Integrated Security=True;";
        
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            connection.Open();
            
            // SQL文を定義(顧客テーブルから全データを取得)
            string sql = "SELECT CustomerID, CustomerName, Email FROM Customers";
            
            // SqlCommandオブジェクトを作成
            using (SqlCommand command = new SqlCommand(sql, connection))
            {
                // ExecuteReaderでデータを取得
                using (SqlDataReader reader = command.ExecuteReader())
                {
                    Console.WriteLine("顧客一覧:");
                    Console.WriteLine("----------------------------");
                    
                    // 1行ずつデータを読み込む
                    while (reader.Read())
                    {
                        int id = reader.GetInt32(0);  // 1列目
                        string name = reader.GetString(1);  // 2列目
                        string email = reader.GetString(2);  // 3列目
                        
                        Console.WriteLine($"ID: {id}, 名前: {name}, メール: {email}");
                    }
                }
            }
        }
    }
}

SqlDataReaderは、データベースから取得したデータを1行ずつ読み込むためのクラスです。Read()メソッドは次の行に進み、データがある場合はtrueを返します。データがなくなるとfalseを返すため、whileループで全てのデータを処理できます。

データの取得にはGetInt32()GetString()などのメソッドを使用します。括弧内の数字は列の位置を示し、0から始まります。つまり、最初の列は0、2番目の列は1となります。

6. データを追加・更新・削除する - ExecuteNonQueryの使い方

6. データを追加・更新・削除する - ExecuteNonQueryの使い方
6. データを追加・更新・削除する - ExecuteNonQueryの使い方

データの追加、更新、削除にはExecuteNonQuery()メソッドを使用します。このメソッドは、影響を受けた行数を整数で返します。以下は新しい顧客データを追加する例です。


using System;
using System.Data.SqlClient;

class Program
{
    static void Main()
    {
        string connectionString = "Server=localhost;Database=SalesDB;Integrated Security=True;";
        
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            connection.Open();
            
            // 新しい顧客を追加するSQL文
            string sql = "INSERT INTO Customers (CustomerName, Email, Phone) VALUES ('山田太郎', 'yamada@example.com', '090-1234-5678')";
            
            using (SqlCommand command = new SqlCommand(sql, connection))
            {
                // SQL文を実行
                int rowsAffected = command.ExecuteNonQuery();
                
                Console.WriteLine($"{rowsAffected}件のデータを追加しました。");
            }
        }
    }
}

このコードでは、INSERTというSQL文を使って新しい顧客データをCustomersテーブルに追加しています。ExecuteNonQuery()の戻り値は、実際に影響を受けた行数です。正常に追加されれば1が返ってきます。

同様に、UPDATEでデータを更新したり、DELETEでデータを削除したりすることもできます。これらもExecuteNonQuery()メソッドで実行します。

7. パラメータ化クエリでSQLインジェクション攻撃を防ぐ

7. パラメータ化クエリでSQLインジェクション攻撃を防ぐ
7. パラメータ化クエリでSQLインジェクション攻撃を防ぐ

先ほどの例では、SQL文に直接値を埋め込んでいましたが、これはSQLインジェクションという攻撃を受ける危険性があります。SQLインジェクションとは、悪意のあるユーザーがSQL文を不正に操作して、データベースを破壊したり、機密情報を盗んだりする攻撃手法です。

これを防ぐために、パラメータ化クエリを使用します。パラメータ化クエリでは、値を直接SQL文に埋め込むのではなく、プレースホルダー(@で始まる名前)を使用し、後から安全に値を設定します。


using System;
using System.Data.SqlClient;

class Program
{
    static void Main()
    {
        string connectionString = "Server=localhost;Database=SalesDB;Integrated Security=True;";
        
        // ユーザーから入力された値(実際はテキストボックスなどから取得)
        string customerName = "佐藤花子";
        string email = "sato@example.com";
        string phone = "080-9876-5432";
        
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            connection.Open();
            
            // パラメータ化されたSQL文(@付きがパラメータ)
            string sql = "INSERT INTO Customers (CustomerName, Email, Phone) VALUES (@Name, @Email, @Phone)";
            
            using (SqlCommand command = new SqlCommand(sql, connection))
            {
                // パラメータに値を設定
                command.Parameters.AddWithValue("@Name", customerName);
                command.Parameters.AddWithValue("@Email", email);
                command.Parameters.AddWithValue("@Phone", phone);
                
                int rowsAffected = command.ExecuteNonQuery();
                Console.WriteLine($"{rowsAffected}件のデータを安全に追加しました。");
            }
        }
    }
}

Parameters.AddWithValue()メソッドを使用することで、値が自動的にエスケープ処理(特殊文字を無害化する処理)され、SQLインジェクション攻撃を防ぐことができます。実際の開発では、必ずこのパラメータ化クエリを使用してください。

8. 単一の値を取得する - ExecuteScalarの使い方

8. 単一の値を取得する - ExecuteScalarの使い方
8. 単一の値を取得する - ExecuteScalarの使い方

ExecuteScalar()メソッドは、クエリの結果から最初の行の最初の列の値だけを取得する場合に使用します。例えば、データの件数を取得したり、最大値や最小値を取得したりする際に便利です。


using System;
using System.Data.SqlClient;

class Program
{
    static void Main()
    {
        string connectionString = "Server=localhost;Database=SalesDB;Integrated Security=True;";
        
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            connection.Open();
            
            // 顧客の総数を取得するSQL文
            string sql = "SELECT COUNT(*) FROM Customers";
            
            using (SqlCommand command = new SqlCommand(sql, connection))
            {
                // ExecuteScalarで単一の値を取得
                object result = command.ExecuteScalar();
                
                if (result != null)
                {
                    int customerCount = Convert.ToInt32(result);
                    Console.WriteLine($"登録されている顧客数:{customerCount}名");
                }
            }
        }
    }
}

ExecuteScalar()はobject型を返すため、適切な型に変換する必要があります。COUNT関数の結果は数値なので、Convert.ToInt32()を使って整数に変換しています。ExecuteScalarは、1つの値だけが必要な場合に効率的な方法です。

9. エラーハンドリング - try-catchでデータベース操作を安全に

9. エラーハンドリング - try-catchでデータベース操作を安全に
9. エラーハンドリング - try-catchでデータベース操作を安全に

データベース操作では、ネットワークエラーや接続の失敗、SQL文の誤りなど、様々なエラーが発生する可能性があります。プログラムが突然終了しないように、try-catch文を使ってエラーを適切に処理することが重要です。

try-catchは、エラーが発生する可能性のあるコードをtryブロックに書き、エラーが発生した場合の処理をcatchブロックに書く仕組みです。これはエアバッグのようなもので、万が一の事故(エラー)が起きても、被害を最小限に抑えることができます。


using System;
using System.Data.SqlClient;

class Program
{
    static void Main()
    {
        string connectionString = "Server=localhost;Database=SalesDB;Integrated Security=True;";
        
        try
        {
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                connection.Open();
                Console.WriteLine("データベース接続成功");
                
                string sql = "SELECT CustomerName FROM Customers WHERE CustomerID = @ID";
                
                using (SqlCommand command = new SqlCommand(sql, connection))
                {
                    command.Parameters.AddWithValue("@ID", 1);
                    
                    object result = command.ExecuteScalar();
                    
                    if (result != null)
                    {
                        Console.WriteLine($"顧客名:{result}");
                    }
                    else
                    {
                        Console.WriteLine("該当する顧客が見つかりませんでした。");
                    }
                }
            }
        }
        catch (SqlException ex)
        {
            // データベース関連のエラー
            Console.WriteLine($"データベースエラーが発生しました:{ex.Message}");
        }
        catch (Exception ex)
        {
            // その他のエラー
            Console.WriteLine($"エラーが発生しました:{ex.Message}");
        }
        finally
        {
            Console.WriteLine("処理が完了しました。");
        }
    }
}

SqlExceptionは、データベース操作に関連するエラーを捕捉するための例外クラスです。接続エラー、SQL文の構文エラー、権限エラーなど、データベース固有のエラーをキャッチできます。一般的なException型の前にSqlException型のcatchを配置することで、より具体的なエラー処理が可能になります。

finallyブロックは、エラーが発生してもしなくても必ず実行される部分です。ログの記録やクリーンアップ処理などを記述します。

10. ADO.NETを使う際の重要なポイントと注意事項

10. ADO.NETを使う際の重要なポイントと注意事項
10. ADO.NETを使う際の重要なポイントと注意事項

ADO.NETでデータベース操作を行う際には、いくつか重要なポイントがあります。まず、接続は必ず閉じることが大切です。usingステートメントを使用することで、自動的に接続が閉じられるため、これを習慣化しましょう。接続を閉じ忘れると、データベースのリソースが無駄に消費され、最終的には新しい接続ができなくなる可能性があります。

次に、パラメータ化クエリを必ず使用することです。ユーザーからの入力値を直接SQL文に埋め込むと、SQLインジェクション攻撃のリスクがあります。常にParameters.AddWithValue()を使用して、安全にデータを扱いましょう。

また、接続文字列は設定ファイルに保管することが推奨されます。プログラムコードに直接書くのではなく、app.configやappsettings.jsonなどの設定ファイルに保管することで、環境ごとに接続先を変更しやすくなります。

さらに、適切なエラーハンドリングを実装することも重要です。データベース操作では様々なエラーが発生する可能性があるため、try-catch文を使って適切にエラーを処理し、ユーザーにわかりやすいメッセージを表示するようにしましょう。

最後に、トランザクションの概念も理解しておくと良いでしょう。複数のデータベース操作をまとめて実行し、すべて成功した場合のみデータを確定する仕組みです。SqlTransactionクラスを使用することで実装できます。これにより、データの整合性を保つことができます。

これらのポイントを意識しながらADO.NETを使用することで、安全で効率的なデータベース操作が実現できます。最初は難しく感じるかもしれませんが、実際にコードを書いて試してみることで、徐々に理解が深まっていきます。

カテゴリの一覧へ
新着記事
New1
C#
C#でループの中に条件分岐を書く方法!入れ子制御構造の基本
New2
C#
C#のthrow文の基本!例外を自分で発生させる方法
New3
C#
C#のADO.NETの基礎!SqlConnectionとSqlCommandの使い方を初心者向けに徹底解説
New4
C#
C#の例外クラス階層を理解しよう!Exception・SystemExceptionの基本をやさしく解説
人気記事
No.1
Java&Spring記事人気No1
C#
C#のpartialクラスとは?初心者でも理解できるクラス分割の基本
No.2
Java&Spring記事人気No2
COBOL
COBOLの数値データ型「PIC 9」の使い方と注意点をやさしく解説!
No.3
Java&Spring記事人気No3
C#
C#のLINQでOrderByを使った並び替えを完全ガイド!初心者でもわかるソート方法
No.4
Java&Spring記事人気No4
C#
C#で型を調べる方法!GetType()・typeof演算子の違いと使い方
No.5
Java&Spring記事人気No5
COBOL
COBOLのコンパイラと開発環境を徹底解説!初心者にもわかりやすい入門ガイド
No.6
Java&Spring記事人気No6
COBOL
COBOLの帳票レイアウトを美しく!可読性向上テクニックを徹底解説
No.7
Java&Spring記事人気No7
C#
C#の引数と戻り値の基本!値を受け渡し・返す仕組みを理解しよう
No.8
Java&Spring記事人気No8
C#
C#のラムダ式の書き方と構文を初心者向けに完全解説