使用VS2013操作MYSQL8 (ADO.NET方式 & EF6)
今天有時間測試了一下通過.net環境操作MYSQL資料庫,測試過程及結果記錄如下:
1、MYSQL安裝
(1)我是從MYSQL官網下載的最新版,即MYSQL8.0,在MySql官網的下載頁面,找到“MySQL Installer for Windows”。
MySql下載頁面地址:https://dev.mysql.com/downloads/
上圖中,MySql for Visual Studio和Connector/NET用於後邊的EF操作,MySQL Installer for Windows為Windows上的安裝檔案下載。
(2)MySql一共提供兩種安裝方式,一種本地安裝,一個是線上安裝,我是下載的本地安裝檔案。如圖:
下載之後一路“Next”,具體安裝方式不詳述,可以參考相關文章。
安裝完成後,順便裝了一個MySql視覺化工具:Navicat for mysql。關於Navicat for mysql的破解安裝,可以參考:https://blog.csdn.net/mqingo/article/details/84314685。
然後在MySql建了一個測試庫Test,同時建了一張測試表:Student,為便於測試,只設置了兩個欄位:Id和Name。
2、ADO.NET方式操作MySql
.(1)NET操作MySql,需要先引用MySQL.Data.dll,這個檔案的預設位置在:C:\Program Files (x86)\MySQL\Connector NET 8.0\Assemblies\v4.5.2。開啟這個資料夾,可以看到除了這個MySQL.Data.dll,MySql官方還提供了其他一些如:MySql.Data.EntityFramework.dll的檔案,後面會用到,其他像MySQL.Data.EntityFrameworkCore.dll應該是針對.net Core的相應提供程式。
(2)新建一個.net控制檯應用程式,引用上面提到的MySQL.Data.dll。通過物件瀏覽器檢視,可以看到MySQL.Data.dll提供了諸如ADO訪問SqlServer的相關功能。如:MySqlConnection 、MySqlCommand、MySqlDataAdapter、MySqlDataReader等,所不同的只是由Sql換成了Mysql。
(3)設定資料庫連線字串,編寫相關程式碼進行測試,幾個內建物件的用法與SqlServer完全相同,不同的只是MySql本身的SQL語法個別與SqlServer不同,因此在執行SQL時應該注意。
class Program { static void Main(string[] args) { string connstr = "Server=localhost;User Id=root;Password=******;PersistSecurityInfo=True;Port=3306;DataBase=test;Charset=utf8mb4;SslMode=none"; //插入資料 using (MySqlConnection conn = new MySqlConnection(connstr)) { MySqlCommand cmd = new MySqlCommand("INSERT INTO Student (name) VALUES('test12')", conn); conn.Open(); cmd.ExecuteNonQuery(); } //資料讀取器測試 using (MySqlConnection conn = new MySqlConnection(connstr)) { MySqlCommand cmd = new MySqlCommand("SELECT * FROM Student", conn); conn.Open(); MySqlDataReader sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection); while(sdr.Read()) { Console.WriteLine(string.Format("Id:{0} Name:{1}", sdr["Id"], sdr["Name"])); } } //DataSet測試 using (MySqlConnection conn = new MySqlConnection(connstr)) { MySqlDataAdapter sda = new MySqlDataAdapter("SELECT * FROM Student", conn); DataTable dt = new DataTable(); sda.Fill(dt); foreach(DataRow dr in dt.Rows) { Console.WriteLine(string.Format("Id:{0} Name:{1}", dr["Id"], dr["Name"])); } } using (MySqlConnection conn = new MySqlConnection(connstr)) { } } }
(4)測試結果
注意事項:
MySql 8的MySql.Data.dll要求.net Framework版本最低為v4.5.2,通過MySql.Data.dll所在路徑也能看出來
如果低於此版本,在程式碼編譯期會無法通過,提示:未能找到型別或名稱空間名稱“MySql”(是否缺少 using 指令或程式集引用?)
3、EF方式操作MySql
採用EF方式操作MySql,需要先安裝兩個外掛,然後還需要通過NuGet安裝EF,中間可能會踩坑。具體步驟如下:
(1)安裝Visual Studio 2013所需外掛
在使用Visual Studio 2013新增ADO.NET實體資料模型新建連線時,預設是沒有Mysql選項的。此時我們需要安裝兩個東西:
1、mysql-for-visualstudio:Mysql的Visual Studio外掛。
mysql-for-visualstudio的官網下載地址:https://dev.mysql.com/downloads/windows/visualstudio/,MySql官網預設提供的版本是1.2.9的安裝包,但1.2.9是不支援VS2013的,如果安裝1.2.9版本的話,會提示最低要求你的VS版本是2015。
此時我們可以下載低版本的安裝包,在剛才的下載頁面上,點選“Looking for previous GA versions?”,如圖:
點選後,在頁面上下載1.1.4版本的安裝包。
2、mysql-connector-net:.net連線Mysql的程式。
網上有資料說,這個.net連線程式並非越高越好,但我既然安裝了MySql 8,自然這個mysql-connector-net也要安裝對應的版本。
mysql-connector-net安裝包下載地址:https://dev.mysql.com/downloads/connector/net/
(2)通過NuGet安裝EF
完成上面的兩個外掛安裝後,在新增ADO.NET資料庫時的資料來源選擇就會出現MySql選擇項,如圖:
在選擇EF版本的時候,會報錯,提示找不到相容的實體框架提供程式。如圖所示:
解決辦法如下:
1、先通過NuGet安裝EntityFramework 6.0
Install-Package EntityFramework -Version 6.0.0
Install-Package EntityFramework.zh-Hans -Version 6.0.0
2、在你的專案中引入C:\Program Files (x86)\MySQL\Connector NET 8.0\Assemblies\v4.5.2下MySql.Data.dll和MySql.Data.EntityFramework.dll兩個檔案。
3、在專案配置檔案的entityFramework節點下的providers節點增加一個提供程式:
<?xml version="1.0" encoding="utf-8"?> <configuration> <configSections> <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> </configSections> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" /> </startup> <entityFramework> <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"> <parameters> <parameter value="v11.0" /> </parameters> </defaultConnectionFactory> <providers> <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.EntityFramework"></provider> <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> </providers> </entityFramework> <connectionStrings> <add name="testEntities" connectionString="***" providerName="System.Data.EntityClient" /> </connectionStrings> </configuration>
注意紅色標識部分,即:MySql.Data.EntityFramework,要與你的MySql.Data.EntityFramework.dll中的名稱空間保持一致,此處版本不同要引用的程式集名稱也不相同。
4、重新生成專案,一定要重新生成專案!
5、重新新增ADO.NET實體資料模型,已經可以新增成功,如圖:
6、可以進行一個簡單測試,測試程式碼如下:
class Program { static void Main(string[] args) { testEntities db = new testEntities(); //新增資料 db.student.Add(new student { Name = "這是一個測試" }); db.SaveChanges(); //讀取資料 foreach(var p in db.student) { Console.WriteLine(p.Name); } } }
以上是VS2013連線MySql的一些記錄,其中.net版本,以及相關安裝包的版本選擇要注意,本文沒有進行更多的測試,還有其他的很多坑沒有踩,踩到再說