ALinq 让Mysql变得如此简单
当大家已经习惯了使用.net 去操作SQL Server,有多少人曾经尝试过使用.net 去操作Mysql数据库!在.net 的光环下,Mysql是显得如此微不足道!但是Mysql的开源又是如此具有诱惑。
1. ADO.NET 方式连接 Mysql数据库
经过在网上查找资料,在 .net 上连接 mysql 数据库有三种方式:
方法一:
使用 CoreLab推出的 MYSQL访问组件,引用命名空间 CoreLab.MySql
方法二:
通过
ODBC访问
MYSQL数据库
, 前要先下载两个组件:
odbc.net和
MYSQL的
ODBC驱动
,可以使用
ODBC访问
Mysql数据库
方法三:
使用
MYSQL推出的
MySQL Connector/Net is an ADO.NET driver for MySQL
,该组件为
MYSQL为
ADO.NET访问
MYSQL数据库设计的
.NET访问组件,使
用
MySql.Data.MySqlClient
以上三种方式的说明可以具体参照文章:
http://blog.****.net/lxh0959/archive/2008/08/05/2773424.aspx
这里要说明的是第三种方式,这种访问方式完全遵循我们 Ado.net 访问 SQL Server的模式,所以使用起来也更加得心应手。
ADO.NET driver for MySQL 下载地址:
官方网站: http://www.mysql.com/downloads/
2. 基础数据库操作
使用 ADO.net 操作数据库,固定不变的模式,五个核心对象
Connection: Connection 对象主要是开启程序和数据库之间的连结。没有利用连结对象将数据库打开,是无法从数据库中取得数据的。
Command: Command 对象主要可以用来对数据库发出一些指令,例如可以对数据库下达查询、新增、修改、删除数据等指令,以及呼叫存在数据库中的预存程序等。
DataAdapter: DataSetCommand 对象主要是在数据源以及 DataSet 之间执行数据传输的工作,它可以透过 Command 对象下达命令后,并将取得的数据放入 DataSet 对象中。
DataSet: DataSet 这个对象可以视为一个暂存区( Cache),可以把从数据库中所查询到的数据保留起来,甚至可以将整个数据库显示出来。 DataSet 的能力不只是可以储存多个 Table 而已,还可以透过 DataSetCommand 对象取得一些例如主键等的数据表结构,并可以记录数据表间的关联。 DataSet 对象可以说是 ADO.NET 中重量级的对象,这个对象架构在 DataSetCommand 对象上,本身不具备和数据源沟通的能力。
DataReader: 当我们只需要循序的读取数据而不需要其它操作时,可以使用 DataReader 对象。 DataReader对象只是一次一笔向下循序的读取数据源中的数据,而且这些数据是只读的,并不允许作其它的操作。因为 DataReader 在读取数据的时候限制了每次只读取一笔,而且只能只读,所以使用起来不但节省资源而且效率很好 .
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MySql.Data.MySqlClient;
namespace CimDataImport
{
public class TestCharacter
{
public const string mysqlConnection = " User Id=root;Host=localhost;Database=cim;password=root " ;
/// <summary>
/// 添加数据
/// </summary>
/// <returns></returns>
public int Add(UserBase entity)
{
string sql = " INSERT INTO cimuser (userid,userNickName) VALUE (@userid,@userNickName) " ;
using (MySqlConnection mycn = new MySqlConnection(mysqlConnection))
{
mycn.Open();
MySqlCommand command = new MySqlCommand(sql, mycn);
command.Parameters.AddWithValue( " @userid " , entity.UserId);
command.Parameters.AddWithValue( " @userNickName " ,entity.UserNickName);
return command.ExecuteNonQuery();
}
}
/// <summary>
/// 修改数据
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public int Update(UserBase entity)
{
string sql = " UPDATE cimuser SET [email protected] WHERE [email protected] " ;
using (MySqlConnection mycn = new MySqlConnection(mysqlConnection))
{
mycn.Open();
MySqlCommand command = new MySqlCommand(sql, mycn);
command.Parameters.AddWithValue( " @userid " , entity.UserId);
command.Parameters.AddWithValue( " @userNickName " , entity.UserNickName);
return command.ExecuteNonQuery();
}
}
/// <summary>
/// 删除数据
/// </summary>
/// <param name="primaryKey"></param>
/// <returns></returns>
public int Delete( int primaryKey)
{
string sql = " DELETE FROM cimuser WHERE [email protected] " ;
using (MySqlConnection mycn = new MySqlConnection(mysqlConnection))
{
mycn.Open();
MySqlCommand command = new MySqlCommand(sql, mycn);
command.Parameters.AddWithValue( " @userid " , primaryKey);
return command.ExecuteNonQuery();
}
}
/// <summary>
/// 根据主键查询
/// </summary>
/// <param name="primaryKey"></param>
/// <returns></returns>
public UserBase Get( int primaryKey)
{
string sql = " SELECT userid,userNickName FROM cimuser where [email protected] " ;
using (MySqlConnection mycn = new MySqlConnection(mysqlConnection))
{
mycn.Open();
MySqlCommand command = new MySqlCommand(sql, mycn);
command.Parameters.AddWithValue( " @userid " , primaryKey);
MySqlDataReader reader = command.ExecuteReader();
UserBase userBase = null ;
if (reader.Read())
{
userBase = new UserBase();
userBase.UserId = Convert.ToInt32(reader[ " userid " ]);
userBase.UserNickName = reader[ " userNickName " ] == DBNull.Value ? null : reader[ " userNickName " ].ToString();
}
return userBase;
}
}
/// <summary>
/// 查询集合
/// </summary>
/// <returns></returns>
public IList < UserBase > GetList()
{
string sql = " SELECT userid,userNickName FROM cimuser limit 1,10 " ;
using (MySqlConnection mycn = new MySqlConnection(mysqlConnection))
{
mycn.Open();
MySqlCommand command = new MySqlCommand(sql, mycn);
MySqlDataReader reader = command.ExecuteReader();
IList < UserBase > list = new List < UserBase > ();
UserBase userBase = null ;
while (reader.Read())
{
userBase = new UserBase();
userBase.UserId = Convert.ToInt32(reader[ " userid " ]);
userBase.UserNickName = reader[ " userNickName " ] == DBNull.Value ? null : reader[ " userNickName " ].ToString();
list.Add(userBase);
}
return list;
}
}
}
}
3. ALinq 让我变得如此简单
在 Linq 没有现世之前, Ado.net 的数据库操作让我们感觉到编程的痛苦,每天重复着相同的数据库操作代码,后来千奇百怪的代码生成器让我们从中解脱出来,虽然有些代码生成器的确非常不错,但是心中始终觉得那些代码少了一些什么!
Linq TO SQL 推出之后,我们感觉到了 .net 语法的甜,是甜到心里的那种甜,感觉自己从代码中彻底释放出来!可是 Linq To SQL 只支持微软的 SQL Server 数据库。
Alinq 是如此完美的解决了多类型数据库操作的问题,在操作 SQL Server 数据上毫不逊色 Linq to SQL,在 Mysql, Oracle,Db2 等数据库操作上更甚一筹!
第一: 新建工程
这里使用控制台程序
第二:添加新建项
第三: 新建数据库连接
第四:添加 Mysql 数据库连接
第五:选择 Mysql 数据源
第六:更改数据源
第七:输入 Mysql 服务名以及账号和密码
第八:测试连接
第九:连接成功
上述操作是必须在安装 ADO.NET driver for MySQL 组件的情况下才能正常操作,否则第六步选择更改数据源的时候看不到 MySql database 选项。
Linq to sql 对于大家来说已经很熟悉了, ALinq 的操作前面的文章也已经详细讲解过了。这里操作不做详细说明了!
4. 中文你让我如何说你
Mysql 数据库开源,更重要的是它能够运行在 Linux系统中!在工作中将 Sql server 数据库中的数据导入到 Mysql 的时候,意想不到的事情发生了,中文在 Mysql 中都变成了乱码。而且 Mysql 是安装在 Linux 系统上的。
Linux 中 Mysql解决乱码问题方案以及操作步骤:
1. 查找 Mysql 下的 .cnf 配置文件
在 windows系统中安装 mysql程序,其中保存保存数据的配置文件名为 my.ini
此文件存在于 mysql安装目录下 ,使用记事本打开此文件修改内容如下:
将 default-character-set=utf8 (有两处 )更改为 default-character-set=GBK 并且添加节点: character_set=gbk
在 Linux中首先查找 mysql 的配置文件命令如下:
find -name *.cnf –print
2. 将 Mysql 中的一个 cnf 文件复制到 etc 文件目录下,并且保存为 my.cnf
在 etc 目录下查找 my.cnf 文件,如果此文件不存在则需要从 1 中查找的文件中 my-large.cnf,
My-small.cnf,my-medium.cnf 三个文件中复制一个到 etc 目录下面,并且保存 my.cnf 文件。
使用命令:
cp /usr/share/mysql/my-large.cnf /etc/
mv etc/my-large.cnf etc/my.cnf
3. 修改 my.cnf 配置文件
cd etc/ 进入 etc 目录下
vi my.cnf 使用 vi 命令打开 my.cnf 文件
如果文件中存在此节点,则将编码方式修改为 gbk
4. 重新启动服务
/etc/init.d/mysql restart 重新启动 mysql 服务
5. 再次导入数据成功