重要的事情说三遍:
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; } } }
最后:需要什么自己可以扩展。一定要朱阿姨配置表中的相关字段和你安装的要对应。