上記の記事で環境の構築ができたら、次は具体的に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文を実行するには、
- SQLiteデータベースへ接続
- 接続開始
- SQLiteデータベースに対して実行されるステートメントを作成
- CommandTextにSQL文を””で囲い、代入
- データベースに対して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文を作成する前にトランザクションを開始させる。
- SQLiteデータベースへ接続
- 接続開始
- トランザクション開始
- SQLiteデータベースに対して実行されるステートメントを作成
- CommandTextにSQL文を””で囲い、代入
- データベースに対してCommandTextを実行
- コミット(ロールバック)
また、引数を使いたい場合は、”$”を使い、プロパティを設定することができる。
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;
    }
}
 
  
  
  
  


コメント