mainフォーム ===================================== Private Sub データ登録()
Dim strSQLite As New strSQLiteClass Dim SQLiteCN As New System.Data.SQLite.SQLiteConnection Dim tran As System.Data.SQLite.SQLiteTransaction = Nothing Dim Names As String Dim Times As String Dim Counts As Long Dim SQLiteOutFolder As String
If strSQLite.NameTime登録(SQLiteCN, Names, Times, SQLiteOutFolder) = True Then Else GoTo ErrEnd End If
If strSQLite.NameCount登録(SQLiteCN, Names, Counts, SQLiteOutFolder) = True Then Else GoTo ErrEnd End If
tran.Commit()
ErrEnd: '正常終了しない、ErrEndの場合はロールバック tran.Rollback()
Catch ex As Exception tran.Rollback()
Finally '破棄 tran.Dispose() SQLiteCN.Dispose()
End Try
End Sub
=====================================
実際に書き込むclass ===================================== Public Class strSQLiteClass Friend Function NameTime登録(ByRef SQLiteCN As System.Data.SQLite.SQLiteConnection, ByVal Names As String, ByVal Times As String, ByVal SQLiteOutFolder As String) As Boolean
Dim strDBFilePath As String = SQLiteOutFolder & "\NameTime.sqlite3" 'データベースファイルの確認 If System.IO.File.Exists(strDBFilePath) = True Then Else '存在しない MessageBox.Show("データベース接続エラー", "データベースが存在しません", MessageBoxButtons.OK, MessageBoxIcon.Error) NameTime登録 = False Exit Function End End If
Catch ex2 As Exception MessageBox.Show(ex2.Message) NameTime登録 = False
Finally '破棄 SQLiteCommand.Dispose()
End Try
Catch ex As Exception MessageBox.Show(ex.Message) NameTime登録 = False
Finally 'クローズ SQLiteCN.Close() End Try
End Function
Friend Function NameCount登録(ByRef SQLiteCN As System.Data.SQLite.SQLiteConnection, ByVal Names As String, ByVal Counts As Long, ByVal SQLiteOutFolder As String) As Boolean
Dim strDBFilePath As String = SQLiteOutFolder & "\NameTime.sqlite3" 'データベースファイルの確認 If System.IO.File.Exists(strDBFilePath) = True Then Else '存在しない MessageBox.Show("データベース接続エラー", "データベースが存在しません", MessageBoxButtons.OK, MessageBoxIcon.Error) NameCount登録 = False Exit Function End End If
冗長でインデントもないコードは読む気がしないですが。
とりあえず、複数のDBファイルにまたがったトランザクションのサンプルを記載しておきます。
// ベタで書いたのでコンパイルが通るかどうか、ちゃんと動くかまでは確認してません。
ポイントは、
・接続は片方のDBファイルに対して行う。もう片方のDBファイルはATTACH DATABASEで接続に参加させる。
メイン側はmain.を、ATTACHした側はATTACH時のASで付けたエイリアスを、テーブル名の前につける。
・トランザクションはOpenしたコネクションに依存するので、Commitする前にコネクションをCloseしたりしない。
INSERTを複数の呼び出しに分けるならコネクションはその間ずっとキープする必要がある。
(もちろんトランザクションも)
本筋以外では
・パラメータは&で文字列結合したりしないで、Parameters.AddWithValueなどでパラメータとして追加する。
Class MultiFileDB
Implements IDisposable
Private m_DbFilePath1 As String = "..."
Private m_DbFilePath2 As String = "..."
Private m_Connection As SQLiteConnection
Private m_Transaction As SQLiteTransaction
Public Sub New()
m_Connection = New SQLiteConnection("Data Source=" & m_DbFilePath1)
m_Connection.Open()
Using comm As New SQLiteCommand("ATTACH DATABASE @file AS sub", m_Connection)
comm.Parameters.AddWithValue("@file", m_DbFilePath2)
comm.ExecuteNonQuery()
End Using
m_Transaction = conn.BeginTransaction()
End Sub
Public Sub InsertToDB1(ByVal name As String, ByVal time As String)
Using comm As New SQLiteCommand("INSERT INTO main.T_NameTime VALUES (@name, @time)", _
m_Connection, m_Transaction)
comm.Parameters.AddWithValue("@name", name)
comm.Parameters.AddWithValue("@time", time)
comm.ExecuteNonQuery()
End Using
End Sub
Public Sub InsertToDB2(ByVal name As String, ByVal time As String)
Using comm As New SQLiteCommand("INSERT INTO sub.T_NameTime VALUES (@name, @time)", _
m_Connection, m_Transaction)
comm.Parameters.AddWithValue("@name", name)
comm.Parameters.AddWithValue("@time", time)
comm.ExecuteNonQuery()
End Using
End Sub
Public Sub Dispose() Implements IDisposable.Dispose
m_Transaction.Commit()
m_Connection.Close()
End Sub
End Class