前提准备:安装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结合使用,效果更佳~