<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、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # SQLite C# 簡介 > 原文: [http://zetcode.com/db/sqlitecsharp/intro/](http://zetcode.com/db/sqlitecsharp/intro/) 在 SQLite C# 教程的第一章中,我們將提供必要的定義。 我們將展示如何安裝 Mono。 本教程中的所有示例都將在 Mono 上運行。 稍后,我們創建第一個工作示例。 ## 關于 SQLite 數據庫 _SQLite_ 是嵌入式關系數據庫引擎。 它的開發者稱其為自包含,無服務器,零配置和事務型 SQL 數據庫引擎。 它非常受歡迎,當今全球有數億本使用。 SQLite 用于 Solaris 10 和 Mac OS 操作系統,iPhone 或 Skype。 Qt4 庫對 SQLite 以及 Python 或 PHP 語言提供了內置支持。 許多流行的應用內部都使用 SQLite,例如 Firefox 或 Amarok。 ```cs $ sudo apt-get install sqlite3 ``` 如果尚未安裝`sqlite3`庫,則需要安裝它。 SQLite 附帶`sqlite3`命令行工具。 它可用于對數據庫發出 SQL 命令。 現在,我們將使用`sqlite3`命令行工具創建一個新數據庫。 ```cs $ sqlite3 test.db SQLite version 3.6.22 Enter ".help" for instructions Enter SQL statements terminated with a ";" ``` 我們為`sqlite3`工具提供了一個參數。 `test.db`是數據庫名稱。 它是我們磁盤上的單個文件。 如果存在,則將其打開。 如果不是,則創建它。 ```cs sqlite> .tables sqlite> .exit $ ls test.db ``` `.tables`命令提供了`test.db`數據庫中的表列表。 當前沒有表。 `.exit`命令終止`sqlite3`命令行工具的交互式會話。 `ls` Unix 命令顯示當前工作目錄的內容。 我們可以看到`test.db`文件。 所有數據將存儲在該單個文件中。 ## Mono Mono 是基于 C# 和公共語言運行時的 ECMA 標準的 Microsoft .NET Framework 的開源實現。 在本教程中,我們需要安裝 Mono 才能編譯和運行示例。 可以從 Linux 發行版的包中安裝 Mono,也可以從源代碼中安裝 Mono,以獲得更多最新版本。 ```cs $ bunzip2 mono-2.10.8.tar.bz2 $ tar -xf mono-2.10.8.tar $ cd mono-2.10.8/ $ ./configure $ make $ sudo make install ``` 我們從 Mono 網站下載`mono-2.10.8.tar.bz2` tarball。 解壓縮,構建并安裝庫。 我們安裝了 Mono 運行時,C# 語言和 SQLite C# 數據適配器。 ```cs $ bunzip2 libgdiplus-2.10.9.tar.bz2 $ tar -xf libgdiplus-2.10.9.tar $ cd libgdiplus-2.10.9/ $ ./configure $ make $ sudo make install ``` 對于帶有 Winforms 控件的示例,我們還需要`libgdiplus`庫。 它位于單獨的文件中。 我們構建并安裝它。 ```cs $ sudo ldconfig $ ldconfig -p | grep libgdiplus libgdiplus.so.0 (libc6) => /usr/local/lib/libgdiplus.so.0 libgdiplus.so (libc6) => /usr/local/lib/libgdiplus.so ``` 我們還運行`ldconfig`工具來更新動態庫的數據庫。 `ldconfig`掃描正在運行的系統,并設置用于加載共享庫的符號鏈接。 `Mono.Data.Sqlite`程序集包含 SQLite 數據庫的 ADO.NET 數據供應器。 它用 C# 編寫,并且可用于所有 CLI 語言:C# ,Visual Basic,Boo 等。 ```cs $ ls /usr/local/lib/mono/4.0/Mono.Data.Sqlite.dll /usr/local/lib/mono/4.0/Mono.Data.Sqlite.dll ``` 從技術角度來看,我們需要一個 DLL。 在我們的系統上,它位于上述路徑下。 (實際上,以上是指向 DLL 的軟鏈接,該 DLL 位于`gac`子目錄中。) ## ADO.NET `ADO.NET`是 .NET 框架的重要組成部分。 該規范統一了對關系數據庫,XML 文件和其他應用數據的訪問。 從程序員的角度來看,它是一組與數據庫和其他數據源一起使用的庫和類。 `Mono.Data.SQLite`是 SQLite 數據庫的 ADO.NET 規范的實現。 它是用 C# 語言編寫的驅動程序,可用于所有.NET 語言。 `SqliteConnection`,`SqliteCommand`,`SqliteDataReader`和`SqliteDataAdapter`是.NET 數據供應器模型的核心元素。 `SqliteConnection`創建到特定數據源的連接。 `SqliteCommand`對象針對數據源執行一條 SQL 語句。 `SqliteDataReader`從數據源讀取數據流。 `SqliteDataAdapter`是`DataSet`和數據源之間的中介。 它填充`DataSet`并解析數據源的更新。 `DataSet`對象用于大量數據的離線工作。 它是一種斷開連接的數據表示形式,可以保存來自各種不同來源的數據。 `SqliteDataReader`和`DataSet`都用于處理數據。 它們在不同的情況下使用。 如果只需要讀取查詢結果,則`SqliteDataReader`是更好的選擇。 如果我們需要更廣泛的數據處理,或者要將 Winforms 控件綁定到數據庫表,則首選`DataSet`。 ## SQLite 版本 如果是第一個程序,我們將檢查 SQLite 數據庫的版本。 ```cs using System; using Mono.Data.Sqlite; public class Example { static void Main() { string cs = "Data Source=:memory:"; SqliteConnection con = null; SqliteCommand cmd = null; try { con = new SqliteConnection(cs); con.Open(); string stm = "SELECT SQLITE_VERSION()"; cmd = new SqliteCommand(stm, con); string version = Convert.ToString(cmd.ExecuteScalar()); Console.WriteLine("SQLite version : {0}", version); } catch (SqliteException ex) { Console.WriteLine("Error: {0}", ex.ToString()); } finally { if (cmd != null) { cmd.Dispose(); } if (con != null) { try { con.Close(); } catch (SqliteException ex) { Console.WriteLine("Closing connection failed."); Console.WriteLine("Error: {0}", ex.ToString()); } finally { con.Dispose(); } } } } } ``` 我們連接到內存數據庫并選擇一個 SQLite 版本。 ```cs using Mono.Data.Sqlite; ``` `Mono.Data.SqliteClient`程序集包含 SQLite 數據庫引擎的 ADO.NET 數據供應器。 我們導入 SQLite 數據供應器的元素。 ```cs string cs = "Data Source=:memory:"; ``` 這是連接字符串。 數據提供者使用它來建立與數據庫的連接。 我們創建一個內存數據庫。 ```cs con = new SqliteConnection(cs); ``` 創建一個`SqliteConnection`對象。 該對象用于打開與數據庫的連接。 ```cs con.Open(); ``` 這行打開數據庫連接。 ```cs string stm = "SELECT SQLITE_VERSION()"; ``` 這是`SQL SELECT`語句。 它返回數據庫的版本。 `SQLITE_VERSION()`是內置的 SQLite 函數。 ```cs SqliteCommand cmd = new SqliteCommand(stm, con); ``` `SqliteCommand`是一個對象,用于在數據庫上執行查詢。 參數是 SQL 語句和連接對象。 ```cs string version = Convert.ToString(cmd.ExecuteScalar()); ``` 有些查詢僅返回標量值。 在我們的例子中,我們需要一個簡單的字符串來指定數據庫的版本。 在這種情況下使用`ExecuteScalar()`。 我們避免了使用更復雜的對象的開銷。 ```cs Console.WriteLine("SQLite version : {0}", version); ``` 數據庫的版本將打印到控制臺。 ```cs } catch (SqliteException ex) { Console.WriteLine("Error: {0}", ex.ToString()); ``` 如果發生異常,我們將錯誤消息打印到控制臺。 ```cs } finally { if (cmd != null) { cmd.Dispose(); } ``` `SqliteCommand`類實現`IDisposable`接口。 因此,必須對其進行明確處理。 ```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 $ dmcs version.cs -r:Mono.Data.Sqlite.dll ``` 我們匯編示例。 提供了 SQLite 數據供應器 DLL 的路徑。 ```cs $ mono ./version.exe SQLite version : 3.7.7 ``` 這是我們系統上程序的輸出。 ## `using`語句 C# 語言實現垃圾回收。 這是一個自動釋放不再需要的對象的過程。 該過程是不確定的。 我們不能確定 CLR(公共語言運行時)何時決定釋放資源。 對于有限的資源,例如文件句柄或網絡連接,最好盡快釋放它們。 使用`using`語句,程序員可以控制何時釋放資源。 當程序超出了`using`塊時,到達其末尾或引發異常,則資源被釋放。 在內部,`using`語句被轉換為`try`,`finally`塊,在`finally`塊中調用了`Dispose()`。 請注意,您可能更喜歡使用`try`,`catch`和`finally`塊,而不是`using`語句。 特別是,如果您想顯式地利用`catch`塊。 在本教程中,我們選擇了 using 語句。 主要是因為代碼較短。 通常,當我們使用`IDisposable`對象時,應在`using`語句中聲明并實例化它。 (或在`finally`塊中調用`Dispose()`方法。)對于 SQLite ADO.NET 驅動程序,我們對`SqliteConnection`,`SqliteCommand`,`SqliteDataReader`,`SqliteCommandBuilder`和`SqliteDataAdapter`類使用`using`語句。 我們不必將其用于`DataSet`或`DataTable`類。 他們可以留給垃圾收集器。 ```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 = new SqliteCommand(con)) { cmd.CommandText = "SELECT SQLITE_VERSION()"; string version = Convert.ToString(cmd.ExecuteScalar()); Console.WriteLine("SQLite version : {0}", version); } con.Close(); } } } ``` 我們有同樣的例子。 這次我們實現了`using`關鍵字。 ```cs using (SqliteConnection con = new SqliteConnection(cs)) { con.Open(); using (SqliteCommand cmd = new SqliteCommand(con)) ``` `SqliteConnection`和`SqliteCommand`都實現`IDisposable`接口。 因此,它們用`using`關鍵字包裝。 ## 創建并填充表 接下來,我們將創建一個數據庫表并用數據填充它。 ```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 = new SqliteCommand(con)) { cmd.CommandText = "DROP TABLE IF EXISTS Cars"; cmd.ExecuteNonQuery(); cmd.CommandText = @"CREATE TABLE Cars(Id INTEGER PRIMARY KEY, Name TEXT, Price INT)"; cmd.ExecuteNonQuery(); cmd.CommandText = "INSERT INTO Cars VALUES(1,'Audi',52642)"; cmd.ExecuteNonQuery(); cmd.CommandText = "INSERT INTO Cars VALUES(2,'Mercedes',57127)"; cmd.ExecuteNonQuery(); cmd.CommandText = "INSERT INTO Cars VALUES(3,'Skoda',9000)"; cmd.ExecuteNonQuery(); cmd.CommandText = "INSERT INTO Cars VALUES(4,'Volvo',29000)"; cmd.ExecuteNonQuery(); cmd.CommandText = "INSERT INTO Cars VALUES(5,'Bentley',350000)"; cmd.ExecuteNonQuery(); cmd.CommandText = "INSERT INTO Cars VALUES(6,'Citroen',21000)"; cmd.ExecuteNonQuery(); cmd.CommandText = "INSERT INTO Cars VALUES(7,'Hummer',41400)"; cmd.ExecuteNonQuery(); cmd.CommandText = "INSERT INTO Cars VALUES(8,'Volkswagen',21600)"; cmd.ExecuteNonQuery(); } con.Close(); } } } ``` 在上面的代碼示例中,我們創建具有 8 行的`Cars`表。 ```cs cmd.CommandText = "DROP TABLE IF EXISTS Cars"; cmd.ExecuteNonQuery(); ``` 首先,如果該表已經存在,則將其刪除。 如果我們不想要結果集,例如對于`DROP`,`INSERT`或`DELETE`語句,可以使用`ExecuteNonQuery()`方法。 ```cs cmd.CommandText = @"CREATE TABLE Cars(Id INTEGER PRIMARY KEY, Name TEXT, Price INT)"; cmd.ExecuteNonQuery(); ``` `Cars`表已創建。 `INTEGER PRIMARY KEY`列在 SQLite 中自動增加。 ```cs cmd.CommandText = "INSERT INTO Cars VALUES(1,'Audi',52642)"; cmd.ExecuteNonQuery(); cmd.CommandText = "INSERT INTO Cars VALUES(2,'Mercedes',57127)"; cmd.ExecuteNonQuery(); ``` 我們在表中插入兩行。 ```cs sqlite> .mode column sqlite> .headers on ``` 在`sqlite3`命令行工具中,我們修改了數據在控制臺中的顯示方式。 我們使用列模式并打開標題。 ```cs sqlite> SELECT * FROM Cars; Id Name Price ---------- ---------- ---------- 1 Audi 52642 2 Mercedes 57127 3 Skoda 9000 4 Volvo 29000 5 Bentley 350000 6 Citroen 21000 7 Hummer 41400 8 Volkswagen 21600 ``` 我們驗證數據。 `Cars`表已成功創建。 ## 預備語句 現在,我們將以預備語句來關注自己。 在編寫預備語句時,我們使用占位符,而不是直接將值寫入語句中。 預準備的語句可提高安全性和性能。 ```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 = new SqliteCommand(con)) { cmd.CommandText = "INSERT INTO Cars(Name, Price) VALUES(@Name, @Price)"; cmd.Prepare(); cmd.Parameters.AddWithValue("@Name", "BMW"); cmd.Parameters.AddWithValue("@Price", 36600); cmd.ExecuteNonQuery(); } con.Close(); } } } ``` 我們向`Cars`表添加一行。 我們使用參數化命令。 ```cs cmd.CommandText = "INSERT INTO Cars(Name, Price) VALUES(@Name, @Price)"; cmd.Prepare(); ``` 在這里,我們創建一個預備語句。 在編寫預備語句時,我們使用占位符,而不是直接將值寫入語句中。 預備語句更快,并且可以防止 SQL 注入攻擊。 `@Name`和`@Price`是占位符,稍后將填充。 ```cs cmd.Parameters.AddWithValue("@Name", "BMW"); cmd.Parameters.AddWithValue("@Price", 36600); ``` 值綁定到占位符。 ```cs cmd.ExecuteNonQuery(); ``` 執行預備語句。 當我們不希望返回任何數據時,我們使用`SqliteCommand`對象的`ExecuteNonQuery()`方法。 ```cs $ mono prepared.exe sqlite> SELECT * FROM Cars; Id Name Price ---------- ---------- ---------- 1 Audi 52642 2 Mercedes 57127 3 Skoda 9000 4 Volvo 29000 5 Bentley 350000 6 Citroen 21000 7 Hummer 41400 8 Volkswagen 21600 9 BMW 36600 ``` 我們有一輛新車插入表。 ## 數據來源 已咨詢 MSDN(Microsoft 開發者網絡)來創建本教程。 該網站有幾種定義。 這是 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>

                              哎呀哎呀视频在线观看