<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # 使用 Visual Basic 的 SQLite 事務 > 原文: [http://zetcode.com/db/sqlitevb/trans/](http://zetcode.com/db/sqlitevb/trans/) 在本章中,我們將處理事務。 首先,我們提供一些基本定義。 然后,我們將有一些程序顯示如何處理事務。 事務是針對一個或多個數據庫中數據的數據庫操作的基本單位。 事務中所有 SQL 語句的影響可以全部提交給數據庫,也可以全部回滾。 在 SQLite 中,除`SELECT`以外的任何命令都將啟動隱式事務。 同樣,在事務中,諸如`CREATE TABLE` ...,`VACUUM`和`PRAGMA`之類的命令將在執行之前提交先前的更改。 手動事務以`BEGIN TRANSACTION`語句開始,并以`COMMIT`或`ROLLBACK`語句結束。 SQLite 支持三種非標準事務級別:`DEFERRED`,`IMMEDIATE`和`EXCLUSIVE`。 除非我們啟動自己的事務,否則 SQLite 會自動將每個命令放入其自己的事務中。 請注意,這也可能會受到驅動程序的影響。 SQLite Python 驅動程序默認情況下已關閉自動提交模式,并且第一個 SQL 命令啟動新事務。 ```vb Option Strict On Imports Mono.Data.Sqlite Module Example Sub Main() Dim cs As String = "URI=file:test.db" Using con As New SqliteConnection(cs) con.Open() Using cmd As New SqliteCommand(con) cmd.CommandText = "DROP TABLE IF EXISTS Friends" cmd.ExecuteNonQuery() cmd.CommandText = "CREATE TABLE Friends(Id INTEGER PRIMARY KEY," _ & "Name TEXT)" cmd.ExecuteNonQuery() cmd.CommandText = "INSERT INTO Friends(Name) VALUES ('Tom')" cmd.ExecuteNonQuery() cmd.CommandText = "INSERT INTO Friends(Name) VALUES ('Rebecca')" cmd.ExecuteNonQuery() cmd.CommandText = "INSERT INTO Friends(Name) VALUES ('Jim')" cmd.ExecuteNonQuery() cmd.CommandText = "INSERT INTO Friends(Name) VALUES ('Robert')" cmd.ExecuteNonQuery() cmd.CommandText = "INSERT INTO Friends(Name) VALUES ('Julian')" cmd.ExecuteNonQuery() End Using con.Close() End Using End Sub End Module ``` 我們創建一個`Friends`表并用數據填充它。 我們沒有明確地啟動事務,也沒有調用`commit`或`rollback`方法。 但是數據已寫入表中。 這是因為默認情況下,我們在自動提交模式下工作。 在這種模式下,每個 SQL 語句立即生效。 ```vb cmd.CommandText = "DROP TABLE IF EXISTS Friends" cmd.ExecuteNonQuery() cmd.CommandText = "CREATE TABLE Friends(Id INTEGER PRIMARY KEY," _ & "Name TEXT)" cmd.ExecuteNonQuery() ``` 如果`Friends`表已經存在,我們將其刪除。 然后,我們使用`CREATE TABLE`語句創建表。 ```vb cmd.CommandText = "INSERT INTO Friends(Name) VALUES ('Tom')" cmd.ExecuteNonQuery() cmd.CommandText = "INSERT INTO Friends(Name) VALUES ('Rebecca')" cmd.ExecuteNonQuery() ... ``` 我們插入兩行。 ```vb sqlite> SELECT * FROM Friends; 1|Tom 2|Rebecca 3|Jim 4|Robert 5|Julian ``` `Friends`表已成功創建。 在第二個示例中,我們將使用`BeginTransaction()`方法啟動自定義事務。 ```vb Option Strict On Imports Mono.Data.Sqlite Module Example Sub Main() Dim cs As String = "URI=file:test.db" Using con As New SqliteConnection(cs) con.Open() Dim tr As SqliteTransaction = con.BeginTransaction() Using tr Using cmd As New SqliteCommand(con) cmd.Transaction = tr cmd.CommandText = "DROP TABLE IF EXISTS Friends" cmd.ExecuteNonQuery() cmd.CommandText = "CREATE TABLE Friends(Id INTEGER PRIMARY KEY," _ & "Name TEXT)" cmd.ExecuteNonQuery() cmd.CommandText = "INSERT INTO Friends(Name) VALUES ('Tom')" cmd.ExecuteNonQuery() cmd.CommandText = "INSERT INTO Friends(Name) VALUES ('Rebecca')" cmd.ExecuteNonQuery() cmd.CommandText = "INSERT INTO Friends(Name) VALUES ('Jim')" cmd.ExecuteNonQuery() cmd.CommandText = "INSERT INTO Friends(Name) VALUES ('Robert')" cmd.ExecuteNonQuery() cmd.CommandText = "INSERT INTO Friends(Name) VALUES ('Julian')" cmd.ExecuteNonQuery() cmd.CommandText = "INSERT INTO Friends(Name) VALUES ('Jane')" cmd.ExecuteNonQuery() End Using tr.Commit() End Using con.Close() End Using End Sub End Module ``` 所有 SQL 命令組成一個單元。 要么全部保存,要么什么都不保存。 這是事務背后的基本思想。 ```vb Dim tr As SqliteTransaction = con.BeginTransaction() ``` `BeginTransaction()`方法啟動事務。 ```vb cmd.Transaction = tr ``` 我們設置`SqliteCommand`在其中執行的事務。 ```vb tr.Commit() ``` 如果一切正常,我們將整個事務提交到數據庫。 如果發生異常,則事務將在后臺回滾。 ## 顯式回滾調用 現在,我們將顯示一個示例,在發生異常的情況下,我們手動回滾事務。 ```vb Option Strict On Imports Mono.Data.Sqlite Module Example Sub Main() Dim cs As String = "URI=file:test.db" Dim con As SqliteConnection Dim tr As SqliteTransaction Dim cmd As SqliteCommand Try con = New SqliteConnection(cs) con.Open() tr = con.BeginTransaction() cmd = con.CreateCommand() cmd.Transaction = tr cmd.CommandText = "DROP TABLE IF EXISTS Friends" cmd.ExecuteNonQuery() cmd.CommandText = "CREATE TABLE Friends(Id INTEGER PRIMARY KEY," _ & "Name TEXT)" cmd.ExecuteNonQuery() cmd.CommandText = "INSERT INTO Friends(Name) VALUES ('Tom')" cmd.ExecuteNonQuery() cmd.CommandText = "INSERT INTO Friends(Name) VALUES ('Rebecca')" cmd.ExecuteNonQuery() cmd.CommandText = "INSERT INTO Friends(Name) VALUES ('Jim')" cmd.ExecuteNonQuery() cmd.CommandText = "INSERT INTO Friends(Name) VALUES ('Robert')" cmd.ExecuteNonQuery() cmd.CommandText = "INSERT INTO Friends(Name) VALUES ('Julian')" cmd.ExecuteNonQuery() cmd.CommandText = "INSERT INTO Friends(Name) VALUES ('Jane')" cmd.ExecuteNonQuery() tr.Commit() Catch ex As SqliteException Console.WriteLine("Error: {0}", ex.ToString()) If tr IsNot Nothing Try tr.Rollback() Catch ex2 As SqliteException Console.WriteLine("Transaction rollback failed.") Console.WriteLine("Error: {0}", ex2.ToString()) Finally tr.Dispose() End Try End If Finally If cmd IsNot Nothing cmd.Dispose() End If If tr IsNot Nothing tr.Dispose() End If If con IsNot Nothing Try con.Close() Catch ex As SqliteException Console.WriteLine("Closing connection failed.") Console.WriteLine("Error: {0}", ex.ToString()) Finally con.Dispose() End Try End If End Try End Sub End Module ``` 我們創建自己的`Try`,`Catch`和`Finally`塊,在其中處理可能的問題。 ```vb Catch ex As SqliteException Console.WriteLine("Error: {0}", ex.ToString()) If tr IsNot Nothing Try tr.Rollback() Catch ex2 As SqliteException Console.WriteLine("Transaction rollback failed.") Console.WriteLine("Error: {0}", ex2.ToString()) Finally tr.Dispose() End Try End If ``` 在創建`Friends`表的過程中引發異常時,我們將調用`Rollback()`方法。 回滾事務也可能失敗; 我們檢查這種情況。 ```vb If cmd IsNot Nothing cmd.Dispose() End If If tr IsNot Nothing tr.Dispose() End If ``` 當一切順利時,我們將配置資源。 ```vb If con IsNot Nothing Try con.Close() Catch ex As SqliteException Console.WriteLine("Closing connection failed.") Console.WriteLine("Error: {0}", ex.ToString()) Finally con.Dispose() End Try End If ``` 關閉連接時,我們可能會收到另一個異常。 我們在這里處理這種情況。 ## 錯誤 當事務中存在錯誤時,將回滾事務,并且不會將任何更改提交到數據庫。 ```vb Option Strict On Imports Mono.Data.Sqlite Module Example Sub Main() Dim cs As String = "URI=file:test.db" Using con As New SqliteConnection(cs) con.Open() Dim tr As SqliteTransaction = con.BeginTransaction() Using tr Using cmd As New SqliteCommand(con) cmd.CommandText = "SELECT * FROM Cars LIMIT 5" cmd.Transaction = tr cmd.CommandText = "UPDATE Friends SET Name='Thomas' WHERE Id=1" cmd.ExecuteNonQuery() cmd.CommandText = "UPDATE Friend SET Name='Bob' WHERE Id=4" cmd.ExecuteNonQuery() tr.Commit() End Using End Using con.Close() End Using End Sub End Module ``` 在代碼示例中,我們要更改兩個名稱。 有兩個語句構成一個事務。 第二個 SQL 語句中有錯誤。 因此,該事務將回滾。 ```vb cmd.CommandText = "UPDATE Friend SET Name='Bob' WHERE Id=4" cmd.ExecuteNonQuery() ``` 表名稱不正確。 數據庫中沒有`Friend`表。 ```vb $ mono error.exe Unhandled Exception: Mono.Data.Sqlite.SqliteException: SQLite error no such table: Friend ... ``` 運行示例將顯示此錯誤消息。 事務回滾。 ```vb sqlite> SELECT * FROM Friends; 1|Tom 2|Rebecca 3|Jim 4|Robert 5|Julian 6|Jane ``` `Friends`表中沒有發生任何變化。 即使第一個`UPDATE`語句正確。 我們將再次嘗試更改兩行; 這次不使用`SqliteTransaction`。 ```vb Option Strict On Imports Mono.Data.Sqlite Module Example Sub Main() Dim cs As String = "URI=file:test.db" Using con As New SqliteConnection(cs) con.Open() Using cmd As New SqliteCommand(con) cmd.CommandText = "SELECT * FROM Cars LIMIT 5" cmd.CommandText = "UPDATE Friends SET Name='Thomas' WHERE Id=1" cmd.ExecuteNonQuery() cmd.CommandText = "UPDATE Friend SET Name='Bob' WHERE Id=4" cmd.ExecuteNonQuery() End Using con.Close() End Using End Sub End Module ``` 我們嘗試更新`Friends`表中的兩個名稱,湯姆(Tom)到托馬斯(Thomas)和羅伯特(Robert)到鮑勃(Bob)。 ```vb cmd.CommandText = "UPDATE Friend SET Name='Bob' WHERE Id=4" cmd.ExecuteNonQuery() ``` 此`UPDATE`語句不正確。 ```vb $ mono error2.exe Unhandled Exception: Mono.Data.Sqlite.SqliteException: SQLite error no such table: Friend ... ``` 我們收到與上一個示例相同的錯誤消息。 ```vb sqlite> SELECT * FROM Friends; 1|Thomas 2|Rebecca 3|Jim 4|Robert 5|Julian 6|Jane ``` 但是這一次,第一個`UPDATE`語句被保存。 第二個不是。 在 SQLite Visual Basic 教程的這一部分中,我們處理了事務。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看