【C#】SQLiteをVisualStudioで使う(②実践)

VisualStudioでSQLiteを実践的に使う C#

上記の記事で環境の構築ができたら、次は具体的にSQL文をVisualStudioで使ってみる。

動作確認環境

・Windows11Pro ver23H2
・VisualStudio2022 ver 17.9.7
・.Net6.0

CREATE文

public Student(int id, string name, int age)
{
    ID = id;
    Name = name;
    Age = age;
}

Studentというクラスのリストのデータベースを作るとする。

戻り値無しのSQL文を実行するには、

  1. SQLiteデータベースへ接続
  2. 接続開始
  3. SQLiteデータベースに対して実行されるステートメントを作成
  4. CommandTextにSQL文を””で囲い、代入
  5. データベースに対してCommandTextを実行

という段階を踏んでいる。

private void Create()
{
    string path = "test.db";

    if (File.Exists(path))
    {
        return;
    }
    // 1.SQLiteデータベースへ接続
    using (SqliteConnection connection = new SqliteConnection(path))
    {
        // 2.接続開始
        connection.Open();
        // 3.SQLiteデータベースに対して実行されるステートメントを作成
        using (SqliteCommand command = connection.CreateCommand())
        {
            // 4.SQL文を入力
            command.CommandText = "CREATE TABLE students(ID INT, NAME TEXT, AGE INT)";

            // 5.データベースに対してCommandTextを実行
            command.ExecuteNonQuery();
        }
    }
}

INSERT文

Studentを引数にしてInsertを行う。

トランザクション有りの場合は、SQL文を作成する前にトランザクションを開始させる。

  1. SQLiteデータベースへ接続
  2. 接続開始
  3. トランザクション開始
  4. SQLiteデータベースに対して実行されるステートメントを作成
  5. CommandTextにSQL文を””で囲い、代入
  6. データベースに対してCommandTextを実行
  7. コミット(ロールバック)

また、引数を使いたい場合は、”$”を使い、プロパティを設定することができる。

private static void Insert(Student student)
{
    // 1.SQLiteデータベースへ接続
    using (SqliteConnection connection = new SqliteConnection("test.db"))
    {
        // 2.接続開始
        connection.Open();
        // 3.トランザクション開始
        using (var transaction = connection.BeginTransaction())
        {
                      try
                      {
                // 4.SQLiteデータベースに対して実行されるステートメントを作成
                using (SqliteCommand command = connection.CreateCommand())
                {
                    // 5.SQL文を入力
                    command.CommandText = "INSERT INTO students VALUES($ID, $NAME, $AGE)";
                    // 各プロパティの設定
                    command.Parameters.AddWithValue("$ID", student.ID);
                    command.Parameters.AddWithValue("$NAME", student.Name);
                    command.Parameters.AddWithValue("$AGE", student.Age);

                    // 6.データベースに対してCommandTextを実行
                    command.ExecuteNonQuery();
                }

                // 7.コミット
                transaction.Commit();
            }
            catch
            {
                // 7.ロールバック
                transaction.RollBack();
                      }
        }
    }
}

UPDATE文

引数のStudentのIDからStudentを特定し、Updateを行う。構文としてはINSERTとほぼ一緒。

private static void Insert(Student student)
{
    using (SqliteConnection connection = new SqliteConnection("test.db"))
    {
        connection.Open();
        // トランザクション開始
        using (var transaction = connection.BeginTransaction())
        {
                      try
                      {
                using (SqliteCommand command = connection.CreateCommand())
                {
                    // SQL文を入力
                    command.CommandText = "UPDATE students SET NAME = $NAME, AGE = $AGE WHERE ID = $ID";
                    // 各プロパティの設定
                    command.Parameters.AddWithValue("$ID", student.ID);
                    command.Parameters.AddWithValue("$NAME", student.Name);
                    command.Parameters.AddWithValue("$AGE", student.Age);

                    // CommandText実行
                    command.ExecuteNonQuery();
                }

                // コミット
                transaction.Commit();
            }
            catch
            {
                // ロールバック
                transaction.RollBack();
                      }
        }
    }
}

DELETE文

引数のIDからStudentを特定し、Deleteを行う。構文としてはINSERT・UPDATEとほぼ一緒。

private static void ExecuteNonQueryWithTransaction(int ID)
{
    using (SqliteConnection connection = new SqliteConnection("test.db"))
    {
        connection.Open();

        using (var transaction = connection.BeginTransaction())
        {
            using (SqliteCommand command = connection.CreateCommand())
            {
                command.CommandText = "DELETE FROM students WHERE ID = $ID";
                command.Parameters.AddWithValue("$ID", ID);
                command.ExecuteNonQuery();
            }

            transaction.Commit();
        }
    }
}

SELECT文

戻り値があるSELECT文は少し書き方が変わってくる。
SQLiteDataReaderに読み込んだデータが入ってくるので、

SQLiteDataReader[”プロパティ名”]

とプロパティ名で指定する。

public static Student Select(int ID)
{
    Student student = new Student();

    using (SqliteConnection connection = new SqliteConnection("test.db"))
    {
        connection.Open();

        using (SqliteCommand command = connection.CreateCommand())
        {
            command.CommandText = SELECT;
            command.Parameters.Add(new SqliteParameter("$ID", ID));
            // 準備
            command.Prepare();

            // 検索
            using (SqliteDataReader reader = command.ExecuteReader())
            {
                while (reader.Read())
                {
                    // 検索結果SqliteDataReaderに各パラメータが入っている。
                    int defaultInt;
                    student.ID = ID;
                    student.Name = reader["NAME"].ToString();
                    student.Age = Int32.TryParse(reader["AGE"].ToString(), out defaultInt) ? defaultInt : 0;
                }
            }
        }

        return student;
    }
}

 

コメント

タイトルとURLをコピーしました