重要的事情说三遍:
MySQL数据库的连接与映射,有两种方式:(1)利用MySql.Data.dll库直接连接,用SQL语句直接操作;(2)利用Nhibernate第三方插件进行映射数据库,进行操作。
MySQL数据库的连接与映射,有两种方式:(1)利用MySql.Data.dll库直接连接,用SQL语句直接操作;(2)利用Nhibernate第三方插件进行映射数据库,进行操作。
MySQL数据库的连接与映射,有两种方式:(1)利用MySql.Data.dll库直接连接,用SQL语句直接操作;(2)利用Nhibernate第三方插件进行映射数据库,进行操作。
图更直接:
MySql数据库安装就不介绍了,32位系统和64位系统下载对应安装包,下载官方:https://dev.mysql.com/downloads/mysql/
MySql.Data.dll库直接连接数据库
首先,创建一个和数据库操作类,我这里用单例。
引用MySql.Data.dll库,可以在NuGet下载,也可以从官网下载引用:https://dev.mysql.com/downloads/windows/installer/8.0.html
定义了数据库连接配置和数据连接后返回的类型conn
class MySqlConnectionHelper
{
private static MySqlConnectionHelper instance;
public static MySqlConnectionHelper Instance
{
get
{
if (instance == null)
instance = new MySqlConnectionHelper();
return instance;
}
}
//连接数据库的配置
private String connetStr = "server=127.0.0.1;port=3306;User Id=root;password=root; database=work;";
private MySqlConnection conn;
}
其次,做数据库连接操作,插入数据,(注意:数据库每操作一次,打开操作完就要关闭)
?
public void Insert(User user, Action<string> callBack)
{
try
{
string userName = user.Username;
string userPassword = user.Password;
DateTime registerdate = user.Registerdate;
//连接数据库
conn = new MySqlConnection(connetStr);
conn.Open();//打开
#region 插入
//插入数据库语句
string insert_sql = "insert into ar_user(Username,Password,Registerdate) values(‘" + userName + "‘,‘" + userPassword + "‘,‘" + registerdate + "‘)";
MySqlCommand cmd = new MySqlCommand(insert_sql, conn);
if (cmd.ExecuteNonQuery() > 0) //cmd.ExecuteNonQuery()执行后会插入成功
{
callBack("successfully");
callBack("数据插入成功");
}
else
{
callBack("failly");
}
cmd.Dispose();
#endregion
conn.Close();
}
catch (MySqlException ex)
{
switch (ex.Number)
{
case 0:
RemoteServer.log.Info("Cannot connect to server. Contact administrator");
break;
case 1045:
RemoteServer.log.Info("Invalid username/password, please try again");
break;
}
}
}
再次,做数据更新
public void Updata(User user, Action<string> callBack)
{
try
{
//建立DataSet对象(相当于建立前台的虚拟数据库)
DataSet ds = new DataSet();
//建立DataTable对象(相当于建立前台的虚拟数据库中的数据表)
DataTable dtable;
//建立DataRowCollection对象(相当于表的行的集合)
DataRowCollection coldrow; //行
//建立DataRow对象(相当于表的列的集合)
DataRow drow; //列
string userName = user.Username;
string userPassword = user.Password;
//查询语句
string select_sql = "select Id,Username,Password from ar_user";
conn = new MySqlConnection(connetStr);
conn.Open();//打开
//建立数据库执行对象
MySqlCommand cmd = new MySqlCommand(select_sql, conn);
//建立执行后的数据对象
MySqlDataAdapter msda = new MySqlDataAdapter(cmd);
///建立 CommandBuilder 对象来自动生成 DataAdapter 的 Command 命令,否则就要自己编写
//Insertcommand ,deletecommand , updatecommand 命令。
MySqlCommandBuilder mySqlCmdBuilder = new MySqlCommandBuilder(msda);
//将查询的结果存到虚拟数据库ds中的虚拟表tab_user中
msda.Fill(ds, "tab_user");
//将数据表tab_user的数据复制到DataTable对象(取数据)
dtable = ds.Tables["tab_user"];
//用DataRowCollection对象获取这个数据表的所有数据行
coldrow = dtable.Rows;
//遍历
for (int i = 0; i < coldrow.Count; i++)
{
drow = coldrow[i];
string name_msg = drow["Username"].ToString();
RemoteServer.log.Info(userName + " : " + name_msg);
if(userName.Equals(name_msg))
{
drow["Password"] = userPassword;
msda.Update(ds, "tab_user");//用此方法,一定要从数据库表拿带有主键的数据
callBack("passord Updata successful");
break;
}
}
cmd.Dispose();
conn.Close();
}
catch (MySqlException ex)
{
switch (ex.Number)
{
case 0:
RemoteServer.log.Info("Cannot connect to server. Contact administrator");
break;
case 1045:
RemoteServer.log.Info("Invalid username/password, please try again");
break;
}
}
}
注意上边两种数据处理方式:数据库操作方式都一样,需要增、删、改、查,只需要改sql查询语句就可以,会返回对应的操作。需要注意上边两个方法采用了不通的数据处理方式,插入数据方法中,采用了用sql语句直接执行插入数据操作。数据更新采用的是Sql语句都用Select查询语句,需要增删改查,都引进了DataSet、DataTable、DataRowCollection、DataRow虚拟表的类,得到的数据MySqlDataAdapter,用MySqlCommandBuilder绑定,对数据虚拟表数据进行增删改查,最后只需msda.Update(ds, "tab_user");把虚拟表中数据更新到数据库中。
利用Nhibernate第三方插件进行映射数据库
引用MySql.Data.dll库和Nhibernate.dll库 ?https://nhibernate.info/
映射数据库配置文件:创建名为hibernate.cfg.xml,名字是固定的,不能自定义,
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory>
<!--设置的数据库类型,一般都是关系型不用变-->
<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
<!--设置数据库版本-->
<property name="dialect">NHibernate.Dialect.MySQL8Dialect</property>
<!--设置使用什么数据库-->
<property name="connection.driver_class">NHibernate.Driver.MySqlDataDriver</property>
<!--连接数据库-->
<property name="connection.connection_string">Server=127.0.0.1;Port=3306;User Id=root;password=root;database=work;</property>
<property name="show_sql">true</property>
</session-factory>
</hibernate-configuration>
配置文件属性设置
数据表字段和实体类属性映射
数据表对应的实体类:
class User
{
public virtual int Id { get; set; }
public virtual string Username { get; set; }//用户名
public virtual string Password { get; set; }//密码
public virtual DateTime Registerdate { get; set; }//s注册时间
}
创建对应的映射配置文件,命名User.hbm.xml? ? User可以自定义,一般都和类名一致。如果自定义,要在读取的地方输入名字路径
<?xml version="1.0" encoding="utf-8" ?>
<!--一个数据表对应一个类对应一个映射配置文件-->
<!--assembly:模型所在的程序集-->
<!--namespace:表示User这个类在那个命名空间下的那个文件内-->
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="AR_RemoteServer"
namespace="AR_RemoteServer.Model">
<class name="User" table="ar_user">
<!--表示User这个类跟数据库里面的user表对应-->
<id name="Id" column="Id" type="Int32">
<!--id name配置User类里面主键的映射,column表示跟数据库中哪个主键对应,type类型-->
<generator class="native"> </generator>
<!--generator表示一个生成器(自动增长),class指定generator的类型,native表示使用数据库自带的生成器-->
</id>
<!--其他类型用property配置,主键特殊用Id标签配置-->
<property name="Username" column="Username" type="String"> </property>
<property name="Password" column="Password" type="String"> </property>
<property name="Registerdate" column="Registerdate" type="Date"></property>
</class>
</hibernate-mapping>
配置文件属性设置,设置不复制,嵌入的资源,就打包在程序里面了
创建配置读取,映射关系解析类NhibernateHelper
class NhibernateHelper
{
private static ISessionFactory _sessionFactory;
private static ISessionFactory SessionFactory
{
get
{
if (_sessionFactory == null)
{
var configuration = new Configuration();
configuration.Configure();//解析nhibernate.cfg文件,也可以指定路径
configuration.AddAssembly("AR_RemoteServer");//解析各种映射文件
_sessionFactory = configuration.BuildSessionFactory();
}
return _sessionFactory;
}
}
public static ISession OpenSession()
{
return SessionFactory.OpenSession();//打开一个数据库会话
}
}
创建数据操作管理类UserManager
interface IUserManager {
void Add(User ser);
void Update(User user);//更新数据
void Remove(User user); //删除数据
User GetById(int id); //根据ID获取数据
User GetByUsername(string username); //根据username获取数据
ICollection<User> GetAllUsers(); //获取所有数据
bool VerifyUser(string username, string password);//验证用户密码
}
class UserManager : IUserManager
{
public void Add(User user)
{
using (ISession session = NhibernateHelper.OpenSession())
{
using (ITransaction transaction = session.BeginTransaction())
{
//进行操作
session.Save(user);
transaction.Commit();//事物的提交
}
}
}
public ICollection<User> GetAllUsers()
{
}
public User GetById(int id)
{
}
public User GetByUsername(string username)
{
}
public void Remove(User user)
{
using (ISession session = NhibernateHelper.OpenSession())
{
using (ITransaction transaction = session.BeginTransaction())//事务的开始
{
//进行操作
session.Delete(user);//删除数据
transaction.Commit();//事物的提交
}
}
}
public void Update(User user)
{
}
//检查数据是否存在数据库
public bool VerifyUser(string username, string password)
{
using (ISession session = NhibernateHelper.OpenSession())
{
IList<User> users = session.CreateCriteria(typeof(User)).List<User>();
User user = session.CreateCriteria(typeof(User))
.Add(Restrictions.Eq("Username", username))
.Add(Restrictions.Eq("Password", password))
.UniqueResult<User>();
if (user == null) return false;
return true;
}
}
}
最后:需要什么自己可以扩展。一定要朱阿姨配置表中的相关字段和你安装的要对应。