<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>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # MySQL Visual Basic 教程 > 原文: [http://zetcode.com/db/mysqlvb/](http://zetcode.com/db/mysqlvb/) 這是針對 MySQL 數據庫的 Visual Basic 教程。 它涵蓋了使用 Visual Basic 進行 MySQL 編程的基礎。 在本教程中,我們使用 _Connector/Net_ 驅動程序。 該驅動程序基于 ADO.NET 規范。 這些示例是在 Ubuntu Linux 上創建和測試的。 在 ZetCode 上有類似的 [MySQL C# 教程](/db/mysqlcsharptutorial/), [MySQL Perl 教程](/db/mysqlperl/)和 [SQLite Visual Basic 教程](/db/sqlitevb/)。 如果您需要重新了解 Visual Basic 語言,可以在 ZetCode 上找到完整的 [Visual Basic 教程](/lang/visualbasic/)。 ## 關于 MySQL 數據庫 MySQL 是領先的開源數據庫管理系統。 它是一個多用戶,多線程的數據庫管理系統。 MySQL 在網絡上特別流行。 它是由 Linux,Apache,MySQL 和 PHP 組成的 _LAMP_ 平臺的組成部分之一。 目前,MySQL 由 Oracle 擁有。 MySQL 數據庫在最重要的 OS 平臺上可用。 它可以在 BSD Unix,Linux,Windows 或 Mac OS 上運行。 維基百科和 YouTube 使用 MySQL。 這些站點每天管理數百萬個查詢。 MySQL 有兩個版本:MySQL 服務器系統和 MySQL 嵌入式系統。 ## 開始之前 我們需要安裝幾個包來執行本教程中的示例:`libmysql6.1-cil`,`mysql-server`,`mysql-client`。 我們需要從 Mono 項目安裝 Visual Basic 編譯器。 從包裝或從來源。 `libmysql6.1-cil`是 CLI 的 MySQL 數據庫連接器。 它用 C# 編寫,可用于所有 CLI 語言。 C# ,Visual Basic,Boo 等。 ```vb $ ls /usr/lib/cli/MySql.Data-6.1/MySql.Data.dll /usr/lib/cli/MySql.Data-6.1/MySql.Data.dll ``` 從技術角度來看,我們需要一個 DLL。 在我的系統(Ubuntu Lucid Lynx)上,它位于上述路徑下。 我們需要知道 DLL 庫的路徑。 匯編我們的例子。 如果您尚未安裝 MySQL,則必須安裝它。 ```vb $ sudo apt-get install mysql-server ``` 此命令將安裝 MySQL 服務器和其他各種包。 在安裝包時,提示我們輸入 MySQL 根帳戶的密碼。 接下來,我們將創建一個新的數據庫用戶和一個新的數據庫。 我們使用`mysql`客戶端。 ```vb $ service mysql status mysql start/running, process 1238 ``` 我們檢查 MySQL 服務器是否正在運行。 如果沒有,我們需要啟動服務器。 在 Ubuntu Linux 上,可以使用`service mysql start`命令來完成。 ```vb $ mysql -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 30 Server version: 5.0.67-0ubuntu6 (Ubuntu) Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | +--------------------+ 2 rows in set (0.00 sec) ``` 我們使用 mysql 監視器客戶端應用連接到服務器。 我們使用根帳戶連接到數據庫。 我們用`SHOW DATABASES`語句顯示所有可用的數據庫。 ```vb mysql> CREATE DATABASE testdb; Query OK, 1 row affected (0.02 sec) ``` 我們創建一個新的`testdb`數據庫。 在整個教程中,我們將使用此數據庫。 ```vb mysql> CREATE USER 'testuser'@'localhost' IDENTIFIED BY 'test623'; Query OK, 0 rows affected (0.00 sec) mysql> USE testdb; Database changed mysql> GRANT ALL ON testdb.* TO 'testuser'@'localhost'; Query OK, 0 rows affected (0.00 sec) mysql> quit; Bye ``` 我們創建一個新的數據庫用戶。 我們授予該用戶`testdb`數據庫所有表的所有特權。 ## 定義 `ADO.NET`是.NET 框架的重要組成部分。 該規范統一了對關系數據庫,XML 文件和其他應用數據的訪問。 `MySQL Connector/Net`是 MySQL 數據庫的 ADO.NET 規范的實現。 它是用 C# 語言編寫的驅動程序,可用于所有.NET 語言。 `Connection`,`Command`,`DataReader`,`DataSet`和`DataProvider`是.NET 數據供應器模型的核心元素。 `Connection`創建到特定數據源的連接。 `Command`對象針對數據源執行一條 SQL 語句。 `DataReader`從數據源讀取數據流。 `DataSet`對象用于脫機處理大量數據。 它是一種斷開連接的數據表示形式,可以保存來自各種不同來源的數據。 `DataReader`和`DataSet`都用于處理數據。 它們在不同的情況下使用。 如果只需要讀取查詢結果,則`DataReader`是更好的選擇。 如果需要更廣泛的數據處理,或者要將`Winforms`控件綁定到數據庫表,則首選`DataSet`。 ## MySQL 版本 如果以下程序運行正常,則我們已安裝一切正常。 我們檢查 MySQL 服務器的版本。 ```vb Option Strict On Imports MySql.Data.MySqlClient Module Example Sub Main() Dim cs As String = "Database=testdb;Data Source=localhost;" _ & "User Id=testuser;Password=test623" Dim conn As New MySqlConnection(cs) Try conn.Open() Console.WriteLine("MySQL version : {0}", conn.ServerVersion) Catch ex As MySqlException Console.WriteLine("Error: " & ex.ToString()) Finally conn.Close() End Try End Sub End Module ``` 我們連接到數據庫并獲取有關 MySQL 服務器的一些信息。 ```vb Imports MySql.Data.MySqlClient ``` 我們導入 MySQL 數據供應器的元素。 ```vb Dim cs As String = "Database=testdb;Data Source=localhost;" _ & "User Id=testuser;Password=test623" ``` 這是連接字符串。 數據提供者使用它來建立與數據庫的連接。 我們指定數據庫名稱,主機,用戶名和密碼。 ```vb Dim conn As New MySqlConnection(cs) ``` 創建一個`MySQLConnection`對象。 該對象用于打開與數據庫的連接。 ```vb conn.Open() ``` 這條線打開連接。 ```vb Console.WriteLine("MySQL version : {0}", conn.ServerVersion) ``` 在這里,我們使用連接對象的`ServerVersion`屬性打印 MySQL 的版本。 ```vb Catch ex As MySqlException Console.WriteLine("Error: " & ex.ToString()) ``` 如果發生異常,我們將錯誤消息打印到控制臺。 ```vb $ vbnc -r:/usr/lib/cli/MySql.Data-6.1/MySql.Data.dll connect.vb ``` 我們匯編我們的例子。 提供了 MySQL 連接器 DLL 的路徑。 ```vb $ ./connect.exe MySQL version : 5.1.41-3ubuntu12.6 ``` 這是我系統上程序的輸出。 接下來是一個更復雜的程序。 ```vb Option Strict On Imports MySql.Data.MySqlClient Module Example Sub Main() Dim cs As String = "Database=testdb;Data Source=localhost;" _ & "User Id=testuser;Password=test623" Dim stm As String = "SELECT VERSION()" Dim version As String Dim conn As MySqlConnection Try conn = New MySqlConnection(cs) conn.Open() Dim cmd As MySqlCommand = New MySqlCommand(stm, conn) version = Convert.ToString(cmd.ExecuteScalar()) Console.WriteLine("MySQL version: {0}", version) Catch ex As MySqlException Console.WriteLine("Error: " & ex.ToString()) Finally conn.Close() End Try End Sub End Module ``` 我們檢查 MySQL 數據庫的版本。 這次使用 SQL 查詢。 ```vb Dim stm As String = "SELECT VERSION()" ``` 這是 SQL `SELECT`語句。 它返回數據庫的版本。 `VERSION()`是內置的 MySQL 函數。 ```vb Dim cmd As MySqlCommand = New MySqlCommand(stm, conn) ``` `MySqlCommand`是一個對象,用于在數據庫上執行查詢。 參數是 SQL 語句和連接對象。 ```vb version = Convert.ToString(cmd.ExecuteScalar()) ``` 有些查詢僅返回標量值。 在我們的例子中,我們需要一個簡單的字符串來指定數據庫的版本。 在這種情況下使用`ExecuteScalar()`。 我們避免了使用更復雜的對象的開銷。 ```vb $ ./connect2.exe MySQL version : 5.1.41-3ubuntu12.6 ``` 結果與前面的示例相同。 ## 創建和填充表 接下來,我們將創建數據庫表并用數據填充它們。 這些表將在本教程中使用。 ```vb DROP TABLE IF EXISTS Books, Authors; CREATE TABLE IF NOT EXISTS Authors(Id INT PRIMARY KEY AUTO_INCREMENT, Name VARCHAR(25)) ENGINE=INNODB; INSERT INTO Authors(Id, Name) VALUES(1, 'Jack London'); INSERT INTO Authors(Id, Name) VALUES(2, 'Honore de Balzac'); INSERT INTO Authors(Id, Name) VALUES(3, 'Lion Feuchtwanger'); INSERT INTO Authors(Id, Name) VALUES(4, 'Emile Zola'); INSERT INTO Authors(Id, Name) VALUES(5, 'Truman Capote'); CREATE TABLE IF NOT EXISTS Books(Id INT PRIMARY KEY AUTO_INCREMENT, AuthorId INT, Title VARCHAR(100), FOREIGN KEY(AuthorId) REFERENCES Authors(Id) ON DELETE CASCADE) ENGINE=INNODB; INSERT INTO Books(Id, AuthorId, Title) VALUES(1, 1, 'Call of the Wild'); INSERT INTO Books(Id, AuthorId, Title) VALUES(2, 1, 'Martin Eden'); INSERT INTO Books(Id, AuthorId, Title) VALUES(3, 2, 'Old Goriot'); INSERT INTO Books(Id, AuthorId, Title) VALUES(4, 2, 'Cousin Bette'); INSERT INTO Books(Id, AuthorId, Title) VALUES(5, 3, 'Jew Suess'); INSERT INTO Books(Id, AuthorId, Title) VALUES(6, 4, 'Nana'); INSERT INTO Books(Id, AuthorId, Title) VALUES(7, 4, 'The Belly of Paris'); INSERT INTO Books(Id, AuthorId, Title) VALUES(8, 5, 'In Cold blood'); INSERT INTO Books(Id, AuthorId, Title) VALUES(9, 5, 'Breakfast at Tiffany'); ``` 我們有一個`books.sql`文件。 它創建兩個數據庫表:`Authors`和`Books`。 這些表是 InnoDB 類型的。 InnoDB 數據庫支持外鍵約束和事務。 我們將外鍵約束放在`Books`表的`AuthorId`列上。 我們用初始數據填充表。 ```vb mysql> source books.sql Query OK, 0 rows affected (0.07 sec) Query OK, 0 rows affected (0.12 sec) Query OK, 1 row affected (0.04 sec) ... ``` 我們使用`source`命令執行`books.sql`腳本。 在下面的示例中,我們將在`Authors`表中插入一個新作者。 ```vb Option Strict On Imports MySql.Data.MySqlClient Module Example Sub Main() Dim connString As String = "Database=testdb;Data Source=localhost;" _ & "User Id=testuser;Password=test623" Dim conn As New MySqlConnection(connString) Dim cmd As New MySqlCommand() Try conn.Open() cmd.Connection = conn cmd.CommandText = "INSERT INTO Authors(Name) VALUES(@Name)" cmd.Prepare() cmd.Parameters.AddWithValue("@Name", "Trygve Gulbranssen") cmd.ExecuteNonQuery() conn.Close() Catch ex As MySqlException Console.WriteLine("Error: " & ex.ToString()) End Try End Sub End Module ``` 我們將新作者添加到`Authors`表中。 我們使用參數化命令。 ```vb cmd.CommandText = "INSERT INTO Authors(Name) VALUES(@Name)" cmd.Prepare() ``` 在這里,我們創建一個預備語句。 在編寫預備語句時,我們使用占位符,而不是直接將值寫入語句中。 預備語句更快,并且可以防止 SQL 注入攻擊。 `@Name`是一個占位符,稍后將填充。 ```vb cmd.Parameters.AddWithValue("@Name", "Trygve Gulbranssen") ``` 值綁定到占位符。 ```vb cmd.ExecuteNonQuery() ``` 執行預備語句。 當我們不希望返回任何數據時,我們使用`MySQLCommand`對象的`ExecuteNonQuery()`方法。 這是當我們創建數據庫或執行`INSERT`,`UPDATE`,`DELETE`語句時。 ```vb $ ./prepared.exe mysql> select * from Authors; +----+--------------------+ | Id | Name | +----+--------------------+ | 1 | Jack London | | 2 | Honore de Balzac | | 3 | Lion Feuchtwanger | | 4 | Emile Zola | | 5 | Truman Capote | | 6 | Trygve Gulbranssen | +----+--------------------+ 6 rows in set (0.00 sec) ``` 我們在表中插入了一位新作者。 ## 使用`MySqlDataReader`檢索數據 `MySqlDataReader`是用于從數據庫檢索數據的對象。 它提供對查詢結果的快速,僅轉發和只讀訪問。 這是從表中檢索數據的最有效方法。 ```vb Option Strict On Imports MySql.Data.MySqlClient Module Example Sub Main() Dim cs As String = "Database=testdb;Data Source=localhost;" _ & "User Id=testuser;Password=test623" Dim conn As New MySqlConnection(cs) Try conn.Open() Dim stm As String = "SELECT * FROM Authors" Dim cmd As MySqlCommand = New MySqlCommand(stm, conn) Dim reader As MySqlDataReader = cmd.ExecuteReader() While reader.Read() Console.WriteLine(reader.GetInt32(0) & ": " _ & reader.GetString(1)) End While reader.Close() Catch ex As MySqlException Console.WriteLine("Error: " & ex.ToString()) Finally conn.Close() End Try End Sub End Module ``` 我們從`Authors`表中獲取所有作者并將其打印到控制臺。 ```vb Dim reader As MySqlDataReader = cmd.ExecuteReader() ``` 要創建`MySQLDataReader`,我們必須調用`MySqlCommand`對象的`ExecuteReader()`方法。 ```vb While reader.Read() Console.WriteLine(reader.GetInt32(0) & ": " _ & reader.GetString(1)) End While ``` `Read()`方法將數據讀取器移至下一條記錄。 如果有更多行,則返回`true`;否則,返回`true`。 否則為假。 我們可以使用數組索引符號來檢索值,或者使用特定的方法來訪問其本機數據類型中的列值。 后者效率更高。 ```vb reader.Close() ``` 閱讀完畢后,請始終調用`Close()`方法。 ```vb $ ./read.exe 1: Jack London 2: Honore de Balzac 3: Lion Feuchtwanger 4: Emile Zola 5: Truman Capote 6: Trygve Gulbranssen ``` 這是示例的輸出。 ## 列標題 接下來,我們將展示如何使用數據庫表中的數據打印列標題。 ```vb Option Strict On Imports MySql.Data.MySqlClient Module Example Sub Main() Dim connString As String = "Database=testdb;Data Source=localhost;" _ & "User Id=testuser;Password=test623" Dim conn As New MySqlConnection(connString) Try conn.Open() Dim stm As String = "SELECT Name, Title From Authors, " _ & "Books WHERE Authors.Id=Books.AuthorId" Dim cmd As MySqlCommand = New MySqlCommand(stm, conn) Dim reader As MySqlDataReader = cmd.ExecuteReader() Console.WriteLine("{0} {1}", reader.GetName(0), _ reader.GetName(1).PadLeft(18)) While reader.Read() Console.WriteLine(reader.GetString(0).PadRight(18) _ & reader.GetString(1)) End While reader.Close() Catch ex As MySqlException Console.WriteLine("Error: " & ex.ToString()) Finally conn.Close() End Try End Sub End Module ``` 在此程序中,我們從`Authors`表中選擇作者,并從`Books`表中選擇他們的書。 ```vb Dim stm As String = "SELECT Name, Title From Authors, " _ & "Books WHERE Authors.Id=Books.AuthorId" ``` 這是將作者與他們的書聯系在一起的 SQL 語句。 ```vb Dim reader As MySqlDataReader = cmd.ExecuteReader() ``` 我們創建一個`MySqlDataReader`對象。 ```vb Console.WriteLine("{0} {1}", reader.GetName(0), _ reader.GetName(1).PadLeft(18)) ``` 我們使用閱讀器的`GetName()`方法獲得列的名稱。 `PadLeft()`方法返回指定長度的新字符串,其中當前字符串的開頭用空格填充。 我們使用此方法正確對齊字符串。 ```vb While reader.Read() Console.WriteLine(reader.GetString(0).PadRight(18) _ & reader.GetString(1)) End While ``` 我們將 SQL 語句返回的數據打印到終端。 ```vb $ ./columns.exe Name Title Jack London Call of the Wild Jack London Martin Eden Honore de Balzac Old Goriot Honore de Balzac Cousin Bette Lion Feuchtwanger Jew Suess Emile Zola Nana Emile Zola The Belly of Paris Truman Capote In Cold blood Truman Capote Breakfast at Tiffany ``` 該程序的輸出。 ## 數據集& `MySqlDataAdapter` `DataSet`是數據庫表中數據的副本以及數據之間的關系。 它在內存中創建,并在需要對數據進行大量處理或將數據表綁定到 Winforms 控件時使用。 處理完成后,更改將被寫入數據源。 `MySqlDataAdapter`是`DataSet`和數據源之間的中介。 它填充`DataSet`并解析數據源的更新。 ```vb Option Strict On Imports System.Data Imports MySql.Data.MySqlClient Module Example Sub Main() Dim cs As String = "Database=testdb;Data Source=localhost;" _ & "User Id=testuser;Password=test623" Dim conn As New MySqlConnection(cs) Dim stm As String = "SELECT * FROM Authors" Try conn.Open() Dim da As New MySqlDataAdapter(stm, conn) Dim ds As New DataSet da.Fill(ds, "Authors") Dim dt As DataTable = ds.Tables("Authors") dt.WriteXml("authors.xml") For Each row As DataRow In dt.Rows For Each col As DataColumn In dt.Columns Console.WriteLine(row(col)) Next Console.WriteLine("".PadLeft(20, "=")) Next Catch ex As MySqlException Console.WriteLine("Error: " & ex.ToString()) Finally conn.Close() End Try End Sub End Module ``` 我們從`Authors`表中打印作者。 這次,我們使用`MySqlDataAdapter`和`DataSet`對象。 ```vb Dim da As New MySqlDataAdapter(stm, conn) ``` 創建一個`MySqlDataAdapter`對象。 它以 SQL 語句和連接為參數。 ```vb Dim ds As New DataSet da.Fill(ds, "Authors") ``` 我們創建并填充`DataSet`。 ```vb Dim dt As DataTable = ds.Tables("Authors") ``` 我們得到名為`Authors`的表。 我們只給了`DataSet`一個表,但它可以包含多個表。 ```vb dt.WriteXml("authors.xml") ``` 我們將數據寫入 XML 文件。 ```vb For Each row As DataRow In dt.Rows For Each col As DataColumn In dt.Columns Console.WriteLine(row(col)) Next Console.WriteLine("".PadLeft(20, "=")) Next ``` 我們將`Authors`表的內容顯示到終端。 為了遍歷數據,我們利用了`DataTable`對象的行和列。 在下一個示例中,我們將表綁定到 Winforms `DataGrid`控件。 ```vb Option Strict On Imports System.Windows.Forms Imports System.Drawing Imports System.Data Imports MySql.Data.MySqlClient Public Class WinVBApp Inherits Form Private dg As DataGrid Private da As MySqlDataAdapter Private ds As DataSet Public Sub New() Me.Text = "DataGrid" Me.Size = New Size(350, 300) Me.InitUI() Me.InitData() Me.CenterToScreen() End Sub Private Sub InitUI() dg = New DataGrid dg.CaptionBackColor = System.Drawing.Color.White dg.CaptionForeColor = System.Drawing.Color.Black dg.CaptionText = "Authors" dg.Location = New Point(8, 0) dg.Size = New Size(350, 300) dg.TabIndex = 0 dg.Parent = Me End Sub Private Sub InitData() Dim cs As String = "Database=testdb;Data Source=localhost;" _ & "User Id=testuser;Password=test623" Dim conn As New MySqlConnection(cs) Dim stm As String = "SELECT * FROM Authors" ds = New DataSet Try conn.Open() da = New MySqlDataAdapter(stm, conn) da.Fill(ds, "Authors") dg.DataSource = ds.Tables("Authors") Catch ex As MySqlException Console.WriteLine("Error: " & ex.ToString()) Finally conn.Close() End Try End Sub Public Shared Sub Main() Application.Run(New WinVBApp) End Sub End Class ``` 在此示例中,我們將`Authors`表綁定到 Winforms `DataGrid`控件。 ```vb Imports System.Windows.Forms Imports System.Drawing ``` 這兩個名稱空間用于 GUI。 ```vb Me.InitUI() Me.InitData() ``` 在`InitUI()`方法內部,我們構建了用戶界面。 在`InitData()`方法中,我們連接到數據庫,將數據檢索到`DataSet`中并將其綁定到`DataGrid`控件。 ```vb dg = New DataGrid ``` `DataGrid`控件已創建。 ```vb Dim stm As String = "SELECT * FROM Authors" ``` 我們將在`DataGrid`控件中顯示`Authors`表中的數據。 ```vb dg.DataSource = ds.Tables("Authors") ``` 我們將`DataGrid`控件的`DataSource`屬性綁定到所選表。 ```vb vbnc -r:/usr/lib/mono/2.0/System.Windows.Forms.dll -r:/usr/lib/cli/MySql.Data-6.1/MySql.Data.dll grid.vb ``` 要編譯該示例,我們必須包含兩個 DLL。 Winforms 的 DLL 和 MySQL 連接器的 DLL。 ![DataGrid](https://img.kancloud.cn/8b/13/8b1380f064c5c5e582e5798d3fc085a7_322x282.jpg) 圖:DataGrid ## 事務支持 `transaction`是針對一個或多個數據庫中數據的數據庫操作的基本單位。 事務中所有 SQL 語句的影響可以全部提交給數據庫,也可以全部回滾。 MySQL 數據庫具有不同類型的存儲引擎。 最常見的是 MyISAM 和 InnoDB 引擎。 MyISAM 是默認的。 在數據安全性和數據庫速度之間需要權衡。 MyISAM 表的處理速度更快,并且不支持事務。 另一方面,InnoDB 表可以更安全地防止數據丟失。 他們支持事務。 它們處理較慢。 ```vb Option Strict On Imports MySql.Data.MySqlClient Module Example Sub Main() Dim cs As String = "Database=testdb;Data Source=localhost;" _ & "User Id=testuser;Password=test623" Dim conn As New MySqlConnection(cs) Dim cmd As New MySqlCommand() Dim tr As MySqlTransaction Try conn.Open() tr = conn.BeginTransaction() cmd.Connection = conn cmd.Transaction = tr cmd.CommandText = "UPDATE Authors SET Name = 'Leo Tolstoy' WHERE Id = 1" cmd.ExecuteNonQuery() cmd.CommandText = "UPDATE Books SET Title = 'War and Peace' WHERE Id = 1" cmd.ExecuteNonQuery() cmd.CommandText = "UPDATE Books SET Titl = 'Anna Karenina' WHERE Id = 2" cmd.ExecuteNonQuery() tr.Commit() conn.Close() Catch ex As MySqlException tr.Rollback() Console.WriteLine("Error: " & ex.ToString()) End Try End Sub End Module ``` 在此程序中,我們想在`Authors`表的第一行上更改作者的姓名。 我們還必須更改與該作者相關的書籍。 一個需要進行事務的很好的例子。 如果我們更改作者但不更改作者的書,則數據已損壞。 ```vb Dim tr As MySqlTransaction ``` `MySqlTransaction`是用于處理事務的對象。 ```vb tr = conn.BeginTransaction() ``` 我們開始事務。 ```vb cmd.CommandText = "UPDATE Books SET Titl = 'Anna Karenina' WHERE Id = 2" cmd.ExecuteNonQuery() ``` 第三個 SQL 語句有一個錯誤。 表中沒有 Titl 欄。 ```vb tr.Commit() ``` 如果沒有異常,則提交事務。 ```vb Catch ex As MySqlException tr.Rollback() Console.WriteLine("Error: " & ex.ToString()) ``` 發生異常時,事務將回滾。 沒有更改提交到數據庫。 ```vb $ ./transaction.exe Error: MySql.Data.MySqlClient.MySqlException: Unknown column 'Titl' in 'field list' at MySql.Data.MySqlClient.MySqlStream.ReadPacket () [0x00000] at MySql.Data.MySqlClient.NativeDriver.ReadResult () [0x00000] mysql> SELECT Name, Title From Authors, Books WHERE Authors.Id=Books.AuthorId; +-------------------+----------------------+ | Name | Title | +-------------------+----------------------+ | Jack London | Call of the Wild | | Jack London | Martin Eden | | Honore de Balzac | Old Goriot | | Honore de Balzac | Cousin Bette | | Lion Feuchtwanger | Jew Suess | | Emile Zola | Nana | | Emile Zola | The Belly of Paris | | Truman Capote | In Cold blood | | Truman Capote | Breakfast at Tiffany | +-------------------+----------------------+ 9 rows in set (0.00 sec) ``` 引發異常。 事務已回滾,并且未進行任何更改。 但是,如果沒有事務,數據是不安全的。 ```vb Option Strict On Imports MySql.Data.MySqlClient Module Example Sub Main() Dim cs As String = "Database=testdb;Data Source=localhost;" _ & "User Id=testuser;Password=test623" Dim conn As New MySqlConnection(cs) Dim cmd As New MySqlCommand() Try conn.Open() cmd.Connection = conn cmd.CommandText = "UPDATE Authors SET Name = 'Leo Tolstoy' WHERE Id = 1" cmd.ExecuteNonQuery() cmd.CommandText = "UPDATE Books SET Title = 'War and Peace' WHERE Id = 1" cmd.ExecuteNonQuery() cmd.CommandText = "UPDATE Books SET Titl = 'Anna Karenina' WHERE Id = 2" cmd.ExecuteNonQuery() conn.Close() Catch ex As MySqlException Console.WriteLine("Error: " & ex.ToString()) End Try End Sub End Module ``` 我們有同樣的例子。 這次,沒有事務支持。 ```vb $ ./update.exe Error: MySql.Data.MySqlClient.MySqlException: Unknown column 'Titl' in 'field list' at MySql.Data.MySqlClient.MySqlStream.ReadPacket () [0x00000] at MySql.Data.MySqlClient.NativeDriver.ReadResult () [0x00000] mysql> SELECT Name, Title From Authors, Books WHERE Authors.Id=Books.AuthorId; +-------------------+----------------------+ | Name | Title | +-------------------+----------------------+ | Leo Tolstoy | War and Peace | | Leo Tolstoy | Martin Eden | | Honore de Balzac | Old Goriot | | Honore de Balzac | Cousin Bette | | Lion Feuchtwanger | Jew Suess | | Emile Zola | Nana | | Emile Zola | The Belly of Paris | | Truman Capote | In Cold blood | | Truman Capote | Breakfast at Tiffany | +-------------------+----------------------+ 9 rows in set (0.00 sec) ``` 再次引發異常。 列夫·托爾斯泰沒有寫馬丁·伊甸園。 數據已損壞。 [Tweet](https://twitter.com/share) 這是帶有 MySQL 連接器的 MySQL Visual Basic 教程。 您可能也對 [MySQL C API 教程](/db/mysqlc/), [MySQL Python 教程](/db/mysqlpython/)或 [MySQL PHP 教程](/databases/mysqlphptutorial/)感興趣。
                  <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>

                              哎呀哎呀视频在线观看