[SQLite] SQLを実行する処理を作成する

スポンサーリンク

SQLには、データを取得するSELECT文、データを変更するINSERT/UPDATE/DELET文があります。
今回はデータ取得に特化したメソッドと、データ変更に特化したメソッドを作成します。

VB.NETはこちら

C#はこちら


VB.NET 編
SQLiteでデータを取得するには、いくつか方法がありますが、データアダプタを使用したメソッドを作成することとします。
SQLiteのデータアダプタは、SQLiteDataAdapterクラスを使用します。
SQLDataAdapterを使用してデータを取得するには、最初にインスタンスを生成します。
SQLDataAdapterのコンストラクタには、実行するSQL文とコネクションオブジェクトを指定します。
また、実行したSQLのデータは Fillメソッドを使用して DataTableに格納します。
以下は、SELECT文を実行して データが収められた DataTableを返却する ExecuteQuery と名付けたメソッドです。

' SQL(SELECT)の実行
Protected Function ExecuteQuery(strSQL As String) As DataTable
    Dim adapter = New SQLiteDataAdapter()
    Dim dtTbl As New DataTable()

    Try
        If _conn.State <> ConnectionState.Open Then Return dtTbl

        adapter = New SQLiteDataAdapter(strSQL, _conn)

        'SQLを実行して結果をdtTblに保存
        adapter.Fill(dtTbl)

    Catch sqlex As SQLiteException
        Throw New Exception(sqlex.Message)

    Catch ex As Exception
        Throw New Exception(ex.Message)

    End Try

    Return dtTbl
End Function

今度は、データを変更する INSERT/UPDATE/DELETEに対応するメソッドを作成します。
SQLiteでは、SQLiteCommandクラスが持つExecuteNonQueryメソッドを使用します。
以下は、 ExecuteNonQueryを実行するメソッドで、実行に成功すると変更のあったレコード件数を返却します。
_failureCount、_successCountは、これまでに実行して変更のあった件数を保持するクラスフィールドです。

' SQL(INSERT/UPDATE/DELETEの実行)
Protected Function ExecuteNonQuery(strSQL As String) As Integer
    Dim count As Integer = -1

    Try
        If _conn.State <> ConnectionState.Open Then Return count

        _cmd.CommandText = strSQL

        count = _cmd.ExecuteNonQuery()

        _successCount += count
    Catch sqlex As SQLiteException
        _failureCount += Math.Abs(count)
        Throw New Exception(sqlex.Message)

    Catch ex As Exception
        Throw New Exception(ex.Message)

    End Try

    Return count
End Function

最後に、成功した総数と失敗した総数を取得できるプロパティを以下のように準備します。

' DataProcessing内で実行したSQL(INSERT/UPDATE/DELETE)の失敗総数
Public ReadOnly Property FailureCount() As Integer
    Get
        Return _failureCount
    End Get
End Property

' DataProcessing内で実行したSQL(INSERT/UPDATE/DELETE)の成功総数
Public ReadOnly Property SuccessCount() As Integer
    Get
        Return _successCount
    End Get
End Property

次回はトランザクション処理を実装します。


C# 編
SQLiteでデータを取得するには、いくつか方法がありますが、データアダプタを使用したメソッドを作成することとします。
SQLiteのデータアダプタは、SQLiteDataAdapterクラスを使用します。
SQLDataAdapterを使用してデータを取得するには、最初にインスタンスを生成します。
SQLDataAdapterのコンストラクタには、実行するSQL文とコネクションオブジェクトを指定します。
また、実行したSQLのデータは Fillメソッドを使用して DataTableに格納します。
以下は、SELECT文を実行して データが収められた DataTableを返却する ExecuteQuery と名付けたメソッドです。

// SQL(SELECT)の実行
protected DataTable ExecuteQuery(string strSQL)
{
    SQLiteDataAdapter adapter = new SQLiteDataAdapter();
    DataTable dtTbl = new DataTable();

    try
    {
        if (_conn.State != ConnectionState.Open) return dtTbl;

        adapter = new SQLiteDataAdapter(strSQL, _conn);

        // SQLを実行して結果をdtTblに保存
        adapter.Fill(dtTbl);
    }
    catch (SQLiteException sqlex)
    {
        
    }
    catch (Exception ex)
    {
        
    }

    return dtTbl;
}

今度は、データを変更する INSERT/UPDATE/DELETEに対応するメソッドを作成します。
SQLiteでは、SQLiteCommandクラスが持つExecuteNonQueryメソッドを使用します。
以下は、 ExecuteNonQueryを実行するメソッドで、実行に成功すると変更のあったレコード件数を返却します。
_failureCount、_successCountは、これまでに実行して変更のあった件数を保持するクラスフィールドです。

// ExecuteNonQueryの失敗総件数
private int _failureCount;

// ExecuteNonQueryの成功総件数
private int _successCount;

// SQL(INSERT/UPDATE/DELETEの実行)
protected int ExecuteNonQuery(string strSQL)
{
    int count = -1;

    try
    {
        if (_conn.State != System.Data.ConnectionState.Open) return count;

        _cmd.CommandText = strSQL;

        count = _cmd.ExecuteNonQuery();

        _successCount += count;
    }
    catch (SQLiteException sqlex)
    {
        _failureCount += Math.Abs(count);
        throw new Exception(sqlex.Message);
    }
    catch (Exception ex)
    {
        throw new Exception(ex.Message);
    }

    return count;
}

最後に、成功した総数と失敗した総数を取得できるプロパティを以下のように準備します。

// DataProcessing内で実行したSQL(INSERT/UPDATE/DELETE)の失敗総数
public int FailureCount
{
    get { return _failureCount; }
}

// DataProcessing内で実行したSQL(INSERT/UPDATE/DELETE)の成功総数
public int SuccessCount
{
    get { return _successCount; }
}

次回はトランザクション処理を実装します。

Please follow and like us:

コメント

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