前提准备:安装MySQL的Connector/Net驱动程序,可以在官网单独找到,也可以在使用MySQL Installer安装MySQL时,一起安装上。
一、直接连接MySQL及操作(直接操作及使用http://ADO.NET)
1.引动MySQL.Data和System.Date库文件到项目引用文件夹。MySQL.Data文件在安装路径的Assemblies文件夹中(默认安装路径为C:\Program Files\MySQL\http://Connector.NET x.x,注意自己安装的是32位还是64位的,如果是32位,查找是否在Program Files(x86)目录文件夹中)。也可以通过联机引用MySQL.Data文件。
2.连接数据库。
使用using引用MySql.Data.MySqlClient命名空间:
using MySql.Data.MySqlClient;
通过MySqlConnection类连接数据库:
MySqlConnection conn = null;
conn = new MySqlConnection("Data Source=localhost;initial Catalog=school;User ID=root;Password=123456");
conn.Open();
连接字符串中常用参数为四个:
Data Source:也可以用Server等代替,表示存储数据库的主机或者IP,本地数据库用localhost;
initial Catalog:也可以用Database等代替,表示数据库名称;
User ID:也可以用Username等代替,表示用户名,一般为root;
Password:表示用户登陆所需密码。
3.对数据库进行增删改查。
可以通过MySqlCommand类对数据库进行操作。
首先创建MySqlCommand对象:
MySqlCommand cmd = new MySqlCommand("insert into test valus(0,'ming')", conn);
第一个参数为SQL语句,第二个参数为之前创建的MySqlConnection对象。
如果SQL语句为“增”“删”“改”语句,则可以使用ExecuteNonQuery()方法进行操作。即为:
cmd.ExecuteNonQuery();
可以接受该方法的返回值,返回值为影响的表的行数。
int n=cmd.ExecuteNonQuery();
变量n即语句执行成功后,影响的表的行数。
直接查询:
如果SQL语句为“查”语句,则需要使用ExecuteReader()方法,并返回MySqlDataReader对象,然后通过其Read()方法读取数据,如果读取到数据,则Read()方法返回true,失败或者读取完毕返回false。Read()方法读取一条数据后,下一次使用Read()方法会读取下一条数据。因此,使用while语句可以读取所有“查”到的数据。实例如下:
MySqlDataReader dr;
dr = cmd.ExecuteReader();
while (dr.Read())
{
Console.Write(dr["id"] + " " + dr["name"]);
}
使用dr["id"]读取数据库表中"id"字段的值,与此对应,使用 dr["name"]读取数据库表中 "name"字段的值。
即使用MySqlDataAdapter,DataSet,DataTable三个类。
这三个类都属于System.Data命名空间,引用此命名空间:
using System.Data;
创建这三个类的对象,
MySqlDataAdapter da = new MySqlDataAdapter(cmd);
DataSet ds = new DataSet();
DataTable
dt = new DataTable();
调用Fill方法执行SQL语句,并将查询存入DataSet对象中, 对数据库检索后,被取回的数据就存放在DataTable对象中
da.Fill(ds, "test");
dt = ds.Tables["test"];
从DataTable对象中查询数据。
for (int i = 0; i < dt.Rows.Count; i++)//读取数据
{
Console.WriteLine(dt.Rows[i]["id"].ToString() + " " + dt.Rows[i]["name"].ToString());
}
4.关闭连接,关闭MySqlDataReader对象
dr.Close();
conn.Close();
完整实例:
using System;
using MySql.Data.MySqlClient;
using System.Data;
namespace DOTNET控制台连接MySQL
{
class Program
{
static void Main(string[] args)
{
MySqlConnection conn = null;//创建MySqlConnection类 conn = new MySqlConnection("Data Source=localhost;initial Catalog=school;User ID=root;Password=123456");//创建连接字符串,提供连接数据库的必要信息 conn.Open();//连接数据库 if(conn.State.ToString()=="Open")//检测是否连接成功 {
Console.WriteLine("连接MySQL数据库成功");
MySqlCommand cmd = new MySqlCommand("insert into test values(0,'hubuyu')", conn);//创建MySqlCommand类,并提供SQL语句,以及要操作的 MySqlConnection对象 int n = cmd.ExecuteNonQuery();//执行SQL语句,对连接的数据库进行操作,ExecuteNonQuery()方法不能用于查询语句 Console.WriteLine("影响行数:" + n);//查看返回值,为影响到的行数
cmd = new MySqlCommand("select*from test", conn);
Console.WriteLine("选择一种查询方式:1为使用MySqlDataReader类进行查询,2为使用ADO.NET(MySqlDataAdapter,DataSet,DataTable类)进行查询:");
int s=Console.Read();
if (s == '1')
{
MySqlDataReader dr;//如果想要使用查询语句,则应先创建MySqlDataReader类,此为ExecuteReader()方法的返回类型 dr = cmd.ExecuteReader();//使用ExecuteReader()方法执行查询语句 while (dr.Read())//使用Read()方法查询返回的MySqlDataReader对象中的数据,返回值为true或false {
Console.WriteLine
(dr["id"] + " " + dr["name"]);//输出查询到的数据,dr["字段名"],这里的字段名对应数据库查询的表中的字段名 }
dr.Close();//关键的一步,不要忘记关闭MySqlDataReader对象!!!!! }
else if (s == '2')
{
MySqlDataAdapter da = new MySqlDataAdapter(cmd);//第二种查询方式,使用MySqlDataAdapter对象 DataSet ds = new DataSet();//创建 DataSet对象 DataTable dt = new DataTable();//创建 DataTable对象 da.Fill(ds, "test");//调用Fill方法执行SQL语句,并将查询存入DataSet对象中 dt = ds.Tables["test"];//对数据库检索后,被取回的数据就存放在DataTable对象中 for (int i = 0; i < dt.Rows.Count; i++)//读取数据 {
Console.WriteLine(dt.Rows[i]["id"].ToString() + " " + dt.Rows[i]["name"].ToString());
}
}
}
else
{
Console.WriteLine("连接失败");
}
conn.Close();//关键的一步,不要忘记关闭连接!!!!! }
}
}
关于数据库,在本实例中,我使用的MySQL数据库为本地数据库,用户名为root,密码123456,数据库名称为school,表名test,表中只有两个字段id int,name varchar(20)。
关键类:
MySqlConnection :连接数据库
MySqlCommand :操作数据库
MySqlDataReader:查询数据的第一种方式
MySqlDataAdapter,DataSet,DataTable:查询数据的第二种方式(http://ADO.NET)
当然,关于操作数据库远不止介绍的这么简单,还有其他的一些方法,但是都离不开最上边上两个类,都属于上面类的拓展方法。如果想了解更多关于操作数据库的方法,可以围绕以上两个类进行搜索。关于上边几个类的细节我就不概述了,只是介绍一下使用方法,想了解关于这几个类的详细介绍,可以直接移步MSDN文档。
对于直接连接这种方式,使用方法较为简单,只需使用这几个类就足够了,但是如果业务繁琐,会使代码量直线上升,这个时候便需要程序员自己把握,使用合理的重构方法了。而且,使用这种方法,需要使用SQL语句,而且也需要程序员对数据库有一定的掌控力,以上无疑会增大程序员的工作量。鉴于此,微软推出了EF框架,即Entity Framework,以解决以上问题。但是要知道,EF框架的底层,是跟上述方法一样,只是简化了程序员的使用,因此弊端便是太复杂的事务难以很好的解决,对性能有些许影响,而且需要程序员对其学习。但是优点也很明显,使用简单,快速开发。
二、使用EF连接MySQL及操作
EF的全称是Entity Framework的全称是http://ADO.NET Entity Framework。
EF有三种开发模式——代码优先,模型优先,数据库优先。
通过第一种方法的介绍我们知道,从我们的代码到数据库之间可大致分为三部分,c#代码,连接及操作数据库的http://ADO.NET的几个类,数据库。
上述的三种模式便对应下边这三部分的开发先后顺序,先写代码逻辑,通过代码类生成对应模型类进而生成对应数据库为代码优先;先建立模型,之后再写代码,并对应使用,然后生成对应数据库为模型优先;先建立数据库,然后生成对应模型,写相应代码为数据库优先。
我将以数据库优先模式介绍使用EF连接MyQSL。
首先,在MySQL中建立想要的数据库及表。详细步骤查阅MySQL的使用,不赘述。
在nutget中找到EntityFramework安装到解决方案。
然后在vs中创建新项目,在项目中添加新建项,选择http://ADO.NET实体数据模型,命名之后添加。
选择来自数据库的EF设计器,点击下一步。
点击新建连接
点击更改数据源,找到MySQL Database,点击选择。
输入对应的服务器名称(本地为localhost),用户名(一般为root),及密码。并选择对应数据库,在本例中是我之前建立的school数据库
选择是否保存密码在连接字符串中,方便演示选择“是”,点击下一步。选择实体框架版本号(5或6),点击下一步。
然后选择想要使用的表,命名模型命名空间。
点击完成。
我们将得到一个后缀为.edmx的文件。
直接显示为我们的是可视化的模型类。
自习观察生成的文件的几个类,发现便是对应我们数据库的表。
注意下图与上图比较,school数据库对应school.tt文件,students表对应students类,test表对应test类。
那,我们要怎么使用他们呢?
通过一个继承自DbContext类的实体类。
使用如下:
var db = new schoolEntities();
新建一个schoolEntities对象,schoolEntities类是哪里来的呢?是我们新建连接的时候命名的实体类。对这个类创建的对象操作,便等同对数据库进行操作。
var text = new test();
text.id = 2;
text.name = "fang";
db.test.Add(text);
db.SaveChanges();
Console.WriteLine(text.id);
对db.test操作便等同于对test表进行操作,上述代码中进行了“增”操作,而其他三种操作类似,只不过拓展方法不同。对数据库操作之后,需要使用SaveChanges()方法保存。对比看来,是不是简单多了!
完整实例:
using System;
using System.Linq;
namespace DOTNET控制台连接MySQL第二种方式_EF_
{
class Program
{
static void Main(string[] args)
{
var db = new schoolEntities();
var text = new test();
text.id = 2;
text.name = "fang";
db.test.Add(text);
db.SaveChanges();
var table = from a in db.test
where a.id == 1
select a;
Console.WriteLine(table.FirstOrDefault().id);
}
}
}
如上所示,可以与linq结合使用,效果更佳~