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

                              哎呀哎呀视频在线观看