[SQLite] 作成したクラスでSQLiteを操作する

これまでに作成したクラスを使用して、実際にSQLiteのデータベース操作を行ってみます。

下準備
コードを書く前に、サンプルデータベースを作成しましょう。
SQLite Database Browserを起動したら[New Database]ボタンをクリックします。
ファイル保存ダイアログが表示されるので、C:\Work の下に、Test.db という名前で保存をします。

サンプルデータベースの作成

Edit table definition というダイアログが表示されるので、以下図のように入力して[OK]ボタンを押します。
アドレス帳をイメージしています。

テーブルの作成
最後に、SQL Databse Browserのツールバーにある[Write Changes]ボタンを押して保存をしておきます。

さて、ここからコードの実装となります。

VB.NETはこちら
C#はこちら


VB.NET 編

まずは、新規クラスとしてDBTest.cs を作成します。
前回までに作成したクラスは抽象クラスなので、継承をして使用します。
コンストラクタでは、引数でデータベースファイルのフルパスを指定できるようにします。
DataProcessingメソッドには実際の(実行したいSQL)処理を記述します。
INSERT/UPDATE/DELETE文は ExecuteNonQueryメソッドで実行します。
SELECT文は、ExecuteQueryメソッドで実行します。
この例のように、DataProcessingの中で複数のSQLを実行することができます。

Public Class DbTest
    Inherits SQLiteCommonBase

    Private _dtTbl As New DataTable()

    ''' <summary>
    ''' コンストラクタ
    ''' </summary>
    ''' <param name="dataSource"></param>
    ''' <remarks></remarks>
    Public Sub New(dataSource As String)
        MyBase.New(dataSource)
    End Sub


    Protected Overrides Sub DataProcessing()
        ExecuteNonQuery("DELETE FROM ADDRESS")

        ExecuteNonQuery("INSERT INTO ADDRESS VALUES (1,""020-0123"", ""東京"", ""HIRO"")")
        ExecuteNonQuery("INSERT INTO ADDRESS VALUES (2,""020-0123"", ""北海道"", ""Jobs"")")
        ExecuteNonQuery("INSERT INTO ADDRESS VALUES (3,""020-0123"", ""神奈川"", ""Bill"")")

        _dtTbl = ExecuteQuery("SELECT * FROM ADDRESS")
    End Sub

    ''' <summary>
    ''' 取得したデータ
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public ReadOnly Property AddressTbl
        Get
            Return _dtTbl
        End Get
    End Property

End Class

それでは上記クラスを使てみましょう。
フォームにボタン1つと、データグリッドビュー1つを貼り付けます。

画面デザイン
ボタンクリック時の処理は以下の通りです。

Private Sub btnExex_Click(sender As Object, e As EventArgs) Handles btnExec.Click

    Dim sqlite = New DbTest("C:\Work\Test.db")

    'トランザクションありで実行
    sqlite.Execute()

    '取得したデータをデータグリッドビューに表示
    DataGridView1.DataSource = sqlite.AddressTbl
End Sub

実行画面

以上で、SQLiteの説明は終了となります。
ご自身でカスタマイズしてより良いクラスにしてください。


C# 編
まずは、新規クラスとしてDBTest.cs を作成します。
前回までに作成したクラスは抽象クラスなので、継承をして使用します。
コンストラクタでは、引数でデータベースファイルのフルパスを指定できるようにします。
DataProcessingメソッドには実際の(実行したいSQL)処理を記述します。
INSERT/UPDATE/DELETE文は ExecuteNonQueryメソッドで実行します。
SELECT文は、ExecuteQueryメソッドで実行します。
この例のように、DataProcessingの中で複数のSQLを実行することができます。

class DbTest : SQLiteCommonBase        
{
    private DataTable _dtTbl = new DataTable();

    /// <summary>
    /// コンストラクタ
    /// </summary>
    /// <param name="dataSource">SQLiteのデータベースファイルのフルパス</param>
    public DbTest(string dataSource)
        : base(dataSource)
    {

    }

    /// <summary>
    /// 実際の処理
    /// </summary>
    protected override void DataProcessing()
    {
        ExecuteNonQuery("DELETE FROM ADDRESS");

        ExecuteNonQuery("INSERT INTO ADDRESS VALUES (1,\"020-0123\", \"東京\", \"HIRO\")");
        ExecuteNonQuery("INSERT INTO ADDRESS VALUES (2,\"020-0123\", \"北海道\", \"Jobs\")");
        ExecuteNonQuery("INSERT INTO ADDRESS VALUES (3,\"020-0123\", \"神奈川\", \"Bill\")");

        _dtTbl = ExecuteQuery("SELECT * FROM ADDRESS");
    }

    /// <summary>
    /// 取得したデータ
    /// </summary>
    public DataTable AddressTbl 
    {
        get
        {
            return _dtTbl;
        }
    }
}

それでは上記クラスを使てみましょう。
フォームにボタン1つと、データグリッドビュー1つを貼り付けます。

画面デザイン
ボタンクリック時の処理は以下の通りです。

private void btnExec_Click(object sender, EventArgs e)
{
    DbTest sqlite = new DbTest(@"C:\Work\Test.db");

    // トランザクションありで実行
    sqlite.Execute();

    // 取得したデータをデータグリッドビューに表示
    dataGridView1.DataSource = sqlite.AddressTbl;
}

実行すると、以下のように登録されたデータが表示されます。

実行画面

以上で、SQLiteの説明は終了となります。
ご自身でカスタマイズしてより良いクラスにしてください。

[SQLite] 一連で処理を実施する

今回は、これまでに作成したメソッドを組み合わせて、一連で処理を実施する部分を作成します。
VB.NETはこちら
C#はこちら


VB.NET 編
トランザクションで一連処理をするメソッドとして、以下のようにExecuteメソッドを作成します。
はじめにBeginTransactionメソッドを呼びます。この中で、データベースへの接続とトランザクションを開始します。
DataProcessingメソッドは抽象メソッドとしてこの後準備します。
DataProcessingメソッドを実行してエラーが発生した場合はロールバック処理を実施します。
最後にEndTransactionメソッドを実施します。コミットとデータベース切断処理を実施します。

''' <summary>
''' データベース操作(トランザクションあり)
''' </summary>
''' <returns>成功時 True</returns>
''' <remarks></remarks>
Public Function Execute() As Boolean
    Dim result As Boolean = True

    If Not BeginTransaction() Then Return False

    Try
        'データ処理
        DataProcessing()

    Catch ex As Exception
        Rollback()
        result = False
    End Try

    If Not EndTransaction() Then result = False

    Return result
End Function

ついでなので、トランザクションのない一連処理をするメソッドを実装します。
Openメソッドでデータベースの接続処理をした後、DataProcessingメソッドを実施します。
最後に Closeメソッドで切断処理を行います。

''' <summary>
''' データベース操作(トランザクションなし)
''' </summary>
''' <returns>成功時 True</returns>
''' <remarks></remarks>
Public Function ExecuteWithoutTransaction() As Boolean
    Dim result As Boolean = True

    If Open() Then
        ' データ処理
        DataProcessing()

        result = Close()
    End If

    Return result
End Function

DataProsessingメソッドは、抽象メソッドとして以下のように準備します。

''' <summary>
''' データ操作(実際のデータ操作を継承先のクラスで実装)
''' </summary>
''' <remarks></remarks>
Protected MustOverride Sub DataProcessing()

以上で、SQLiteを使用したデータ操作をするクラスの作成は完了となります。
必要に応じて機能を追加したり、変更したりしてください。
一応基本的なことは行えるようになっています。
ご自身の責任のもとでご使用ください。

次回は、作成したクラスを実際に使用する方法について説明します。


C# 編
トランザクションで一連処理をするメソッドとして、以下のようにExecuteメソッドを作成します。
はじめにBeginTransactionメソッドを呼びます。この中で、データベースへの接続とトランザクションを開始します。
DataProcessingメソッドは抽象メソッドとしてこの後準備します。
DataProcessingメソッドを実行してエラーが発生した場合はロールバック処理を実施します。
最後にEndTransactionメソッドを実施します。コミットとデータベース切断処理を実施します。

/// <summary>
/// データベース操作(トランザクションあり)
/// </summary>
/// <returns>成功時 true</returns>
public bool Execute()
{
    bool result = true;

    // トランザクション開始
    if (!BeginTransaction())
    {
        return false;
    }

    try
    {
        // データ処理
        DataProcessing();
    }
    catch
    {
        Rollback();
        result = false;
    }

    // トランザクション終了
    if (!EndTransaction())
    {
        result = false;
    }

    return result;
}

ついでなので、トランザクションのない一連処理をするメソッドを実装します。
Openメソッドでデータベースの接続処理をした後、DataProcessingメソッドを実施します。
最後に Closeメソッドで切断処理を行います。

/// <summary>
/// データベース操作(トランザクションあり)
/// </summary>
/// <returns>成功時 true</returns>
public bool ExecuteWithoutTransaction()
{
    bool result = true;

    if ( Open() )
    { 
        // データ処理
        DataProcessing();

        result = Close();
    }

    return result;
}

DataProsessingメソッドは、抽象メソッドとして以下のように準備します。

/// <summary>
/// データ操作(実際のデータ操作を継承先のクラスで実装)
/// </summary>
protected abstract void DataProcessing();

以上で、SQLiteを使用したデータ操作をするクラスの作成は完了となります。
必要に応じて機能を追加したり、変更したりしてください。
一応基本的なことは行えるようになっています。
ご自身の責任のもとでご使用ください。

次回は、作成したクラスを実際に使用する方法について説明します。

[SQLite] トランザクション処理をする

SQLiteでトランザクション処理を行うには

SQLiteConnection1オブジェクトの、BeginTransactionメソッド、EndTransactionメソッド、Rollbackメソッドを使用します。
今回は、これらをラッピングしたメソッドを実装します。

VB.NETはこちら

C#はこちら


VB.NET 編
まずは、トランザクションの開始をする BeginTransactionのラッピングメソッドです。
このメソッドの中で、データベース接続を実施し、接続が成功した場合にトランザクションを開始するようにします。

''' <summary>
''' トランザクション開始処理
''' </summary>
''' <returns>トランザクション開始成功時 True</returns>
''' <remarks></remarks>
Private Function BeginTransaction() As Boolean
    Try
        'データベースのオープンに失敗した場合は処理を抜ける
        If Not Open() Then Return False

        ' データベースがクローズ状態の場合処理終了
        If _conn.State = ConnectionState.Closed Then Return False

        'トランザクションの開始
        _cmd.Transaction = _conn.BeginTransaction()

        Return True
    Catch sqlex As SQLiteException
        System.Diagnostics.Debug.WriteLine(sqlex.Message)

    Catch ex As Exception
        System.Diagnostics.Debug.WriteLine(ex.Message)

    End Try

    Return False
End Function

続いてロールバック処理です。
SQLの実行に失敗した場合のロールバック処理を受け持ちます。

''' <summary>
''' ロールバック処理
''' </summary>
''' <returns>ロールバック成功時 true</returns>
''' <remarks></remarks>
Private Function Rollback() As Boolean
    Try
        ' ロールバック実施
        _cmd.Transaction.Rollback()

        Return True


    Catch sqlex As SQLiteException
        System.Diagnostics.Debug.WriteLine(sqlex.Message)

    Catch ex As Exception
        System.Diagnostics.Debug.WriteLine(ex.Message)

    End Try

    Return False
End Function

最後は、トランザクションの終了処理です。
これまでに実行したSQLのコミット処理を受け持ちます。
また、データベースの切断処理も行います。

''' <summary>
''' トランザクション終了処理
''' </summary>
''' <returns>コミットおよびデータベース切断が成功した場合 True</returns>
''' <remarks></remarks>
Private Function EndTransaction() As Boolean
    Try
        'コミット処理
        _cmd.Transaction.Commit()

        Close()

        Return True

    Catch sqlex As SQLiteException
        System.Diagnostics.Debug.WriteLine(sqlex.Message)

    Catch ex As Exception
        System.Diagnostics.Debug.WriteLine(ex.Message)

    End Try

    Return False
End Function

次回は、これまでに作成したメソッドを一連で動かすメソッドの実装を行います。


C# 編
まずは、トランザクションの開始をする BeginTransactionのラッピングメソッドです。
このメソッドの中で、データベース接続を実施し、接続が成功した場合にトランザクションを開始するようにします。

/// <summary>
/// トランザクション開始処理
/// </summary>
/// <returns>トランザクション開始成功時 true</returns>
private bool BeginTransaction()
{           
    try
    {
        // データベースのオープンに失敗した場合は処理を抜ける
        if (!Open()) return false;

        // データベースがクローズ状態の場合処理終了
        if (_conn.State == System.Data.ConnectionState.Closed) return false;

        // トランザクションの開始
        _cmd.Transaction = _conn.BeginTransaction();

        return true;
    }
    catch (SQLiteException sqlex)
    {

    }
    catch (Exception ex)
    {

    }

    return false;
}

続いてロールバック処理です。
SQLの実行に失敗した場合のロールバック処理を受け持ちます。

/// <summary>
/// ロールバック処理
/// </summary>
/// <returns>ロールバック成功時 true</returns>
private bool Rollback()
{
    try
    {
        // ロールバック実施
        _cmd.Transaction.Rollback();

        return true;
    }
    catch (SQLiteException sqlex)
    {
        System.Diagnostics.Debug.WriteLine(sqlex.Message);
    }
    catch (Exception ex)
    {
        System.Diagnostics.Debug.WriteLine(ex.Message);
    }

    return false;
}

最後は、トランザクションの終了処理です。
これまでに実行したSQLのコミット処理を受け持ちます。
また、データベースの切断処理も行います。

/// <summary>
/// トランザクション終了処理
/// </summary>
/// <returns>コミットおよびデータベース切断が成功した場合 true</returns>
private bool EndTransaction()
{
    try
    {
        // コミット処理
        _cmd.Transaction.Commit();

        Close();

        return true;
    }
    catch (SQLiteException sqlex)
    {
        System.Diagnostics.Debug.WriteLine(sqlex.Message);
    }
    catch (Exception ex)
    {
        System.Diagnostics.Debug.WriteLine(ex.Message);
    }

    return false;
}

次回は、これまでに作成したメソッドを一連で動かすメソッドの実装を行います。