上記の記事で環境の構築ができたら、次は具体的に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;
}
}
コメント