Unity MySql安装部署与Unity连接 下篇

一、前言

        上篇讲到了如何安装与部署本地MySql;本篇主要讲Unity与MySql连接、创建表、删除表,然后就是对表中数据的增、删、改、查等操作。再讲这些之前会说一些安装MySql碰到的一些问题和Unity连接的问题。

        当把本地MySql部署好之后,我们可能会遇到只有本机能访问的问题,如果碰到这个问题,我们需要把当前数据库的权限修改一下,如图所示,这是我们新建一个数据库后自动生成的一个user表,里面包含一些访问权限,如果没开放权限,那么当我们在局域网下访问装有mysql的机器时会发现只有本机可以访问到,其他机器访问不了,这时候我们就需要执行一些命令来修改访问权限。

第一步:cd MySql路径

第二步:登录 mysql -u root -p

第三步:进入数据库 use mysql

第四步:select user,host from user;

第五步:uptate user set host='%' where user='root';

这样就ok了,最后在刷新一下

flush privileges; 这样就可以在局域网下,所有机器都能访问到这个数据库

二、Unity连接MySql

        可以先在网上找到与自己.net或者mysql对应版本的MySql.Data.dll文件,将这个文件下载下来放到Unity Plugins文件夹下,我这里用的是5.7.38版本

        下一步就是熟悉MySql的命令语句,这个可以去MySql官网查询,这里就不多讲了;直接来看一下unity怎么连接MySql和对数据库中的数据进行操作。

        连接MySql:

//连接类对象
        MySqlConnection msc;

        /// <summary>
        /// 连接数据库
        /// </summary>
        /// <param name="serverIP">IP地址</param>
        /// <param name="port">端口</param>
        /// <param name="user">用户名</param>
        /// <param name="passwd">密码</param>
        /// <param name="database">数据库名称</param>
        /// <param name="format">字体默认UTF8</param>
        public void Connect(string serverIP, string port, string user, string password, string sqlName)
        {
            string connectStr = $"server = {serverIP};port = {port};user = {user};database = {sqlName};password = {password};charset = utf8";
            msc = new MySqlConnection(connectStr);
        }

        打开和关闭连接:

        /// <summary>
        /// 打开数据库连接
        /// </summary>
        public void Open()
        {
            msc.Open();
        }
 
        /// <summary>
        /// 关闭数据库连接
        /// </summary>
        public void Close()
        {
            msc.Close();
        }

        完成上述操作,我们基本上就可以连接、打开、关闭数据库了。再下面就是对数据库中表的一些操作。

        表    查找  -->  创建  -->  删除

#region 表 --> 查找 --> 创建  --> 删除
        /// <summary>
        /// 查找表是否存在
        /// </summary>
        /// <param name="tablename"></param>
        /// <returns></returns>
        public bool IsTableExist(string tablename)
        {
            bool tableExists = false;
            string query = "SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = @TableName";

            using (MySqlCommand command = new MySqlCommand(query, msc))
            {
                command.Parameters.AddWithValue("@TableName", tablename);
                tableExists = Convert.ToInt32(command.ExecuteScalar()) > 0;
            }
            return tableExists;
        }
        
        /// <summary>
        /// 创建表
        /// </summary>
        /// <param name="name"></param>
        /// <param name="property"></param>
        /// <param name="type"></param>
        /// <returns></returns>
        public int CreateTable(string name, string[] property, string[] type)
        {
            string query = $"CREATE TABLE IF NOT EXISTS UserMgr (ID VARCHAR(255), Type VARCHAR(255), UserName VARCHAR(255), Password VARCHAR(255))";
            
            return ExecuteNonQuery(query);
        }
        
        /// <summary>
        /// 删除表
        /// </summary>
        /// <param name="tableName"></param>
        /// <returns></returns>
        public int DeleteTable(string tableName)
        {
            string query = $"DROP TABLE IF EXISTS {tableName};";
 
            return ExecuteNonQuery(query);
        }
        #endregion

       

        增:

#region 增
        /// <summary>
        /// 添加数据
        /// </summary>
        /// <param name="ID"></param>
        /// <param name="type"></param>
        /// <param name="username"></param>
        /// <param name="password"></param>
        public void AddTableData(string ID, string type, string username, string password)
        {
            string sql = "insert into usermgr(ID,Type,UserName,Password) values('" + ID + "','" + type + "','" + username + "','" + password + "')";
            MySqlCommand cmd = new MySqlCommand(sql, msc);
            //返回更改数据行数
            int result = cmd.ExecuteNonQuery();
            Debug.Log("添加数据成功:"+ result);
        }
        #endregion

        删:

 #region 删
        /// <summary>
        /// 删除指定ID的数据
        /// </summary>
        /// <param name="ID"></param>
        public void DeleteTableData(string ID)
        {
            //删除的sql命令,这里是删除player中id=2的一行数据
            string sql = $"delete from usermgr where ID={ID}";                                     
            MySqlCommand cmd = new MySqlCommand(sql, msc);
            int result = cmd.ExecuteNonQuery();
            Debug.Log("删除数据成功:" + result);
        }
        #endregion

        改:

#region 改
        /// <summary>
        /// 根据id去修改 用户类型 用户名 用户密码
        /// </summary>
        /// <param name="tableName"></param>
        /// <param name="ID"></param>
        /// <param name="username"></param>
        /// <param name="password"></param>
        public void AmendTableData(string ID, string type, string username, string password)
        {
            //更新
            string sql = $"update UserMgr set UserName='{username}',Password='{password}',Type='{type}' where ID={ID}";//更改的sql命令
            MySqlCommand cmd = new MySqlCommand(sql, msc);
            //返回值是数据库中修改的行数
            int result = cmd.ExecuteNonQuery();
            Debug.Log("更新数据成功:" + result);
        }
        #endregion

        查:

#region 查
        /// <summary>
        /// 查找所有表中所有的数据
        /// </summary>
        public List<UserData> FindTableData()
        {
            string query = "SELECT * FROM usermgr";
            List<UserData> userDatas = new List<UserData>();
            using (MySqlCommand command = new MySqlCommand(query,msc))
            {
                using (MySqlDataReader reader = command.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        UserData data = new UserData();
                        data.id = int.Parse(reader.GetString("ID"));
                        data.type = int.Parse(reader.GetString("Type"));
                        data.username = reader.GetString("UserName");
                        data.password = reader.GetString("Password");
                        
                        //Debug.LogError(data.id + data.type + data.username + data.password);
                        
                        userDatas.Add(data);
                    }
                }
            }

            return userDatas;
        }
        #endregion

以上就是Unity与MySql连接进行一些数据库的基本操作。喜欢的小伙伴点个赞、关注一下吧,写这么多不容易。下面是完整的代码及用法。

完整代码:

        var mySql = new SqlHelper();
        mySql.Connect("192.168.3.250","3306","root","root","kcsql");
        mySql.Open();
        //查找表
        if (!mySql.IsTableExist("UserMgr"))
        {
            //创建表
            mySql.CreateTable("UserMgr", new[] {"Type", "User", "Password"}, new[] {"varchar", "varchar", "varchar"});
        }
        //删除表
        //mySql.DeleteTable("UserMgr");
        //增
        //mySql.AddTableData("2","1","lisi","123456");
        //删
        //mySql.DeleteTableData("2");
        //改
        //mySql.AmendTableData("0","0","pqy","pqy666");
        //查
        //mySql.FindTableData();
        
        mySql.Close();
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Data;
using MySql.Data.MySqlClient;
using System;

namespace KC.MySql
{
    public class SqlHelper
    { 
        string connectStr;
        //连接类对象
        MySqlConnection msc;

        /// <summary>
        /// 连接数据库
        /// </summary>
        /// <param name="serverIP">IP地址</param>
        /// <param name="port">端口</param>
        /// <param name="user">用户名</param>
        /// <param name="passwd">密码</param>
        /// <param name="database">数据库名称</param>
        /// <param name="format">字体默认UTF8</param>
        public void Connect(string serverIP, string port, string user, string password, string sqlName)
        {
            connectStr = $"server = {serverIP};port = {port};user = {user};database = {sqlName};password = {password};charset = utf8";
            msc = new MySqlConnection(connectStr);
        }
 
        /// <summary>
        /// 打开数据库连接
        /// </summary>
        public void Open()
        {
            msc.Open();
        }
 
        /// <summary>
        /// 关闭数据库连接
        /// </summary>
        public void Close()
        {
            msc.Close();
        }

        #region 表 --> 查找 --> 创建  --> 删除
        /// <summary>
        /// 查找表是否存在
        /// </summary>
        /// <param name="tablename"></param>
        /// <returns></returns>
        public bool IsTableExist(string tablename)
        {
            bool tableExists = false;
            string query = "SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = @TableName";

            using (MySqlCommand command = new MySqlCommand(query, msc))
            {
                command.Parameters.AddWithValue("@TableName", tablename);
                tableExists = Convert.ToInt32(command.ExecuteScalar()) > 0;
            }
            return tableExists;
        }
        
        /// <summary>
        /// 创建表
        /// </summary>
        /// <param name="name"></param>
        /// <param name="property"></param>
        /// <param name="type"></param>
        /// <returns></returns>
        public int CreateTable(string name, string[] property, string[] type)
        {
            string query = $"CREATE TABLE IF NOT EXISTS UserMgr (ID VARCHAR(255), Type VARCHAR(255), UserName VARCHAR(255), Password VARCHAR(255))";
            
            return ExecuteNonQuery(query);
        }
        
        /// <summary>
        /// 删除表
        /// </summary>
        /// <param name="tableName"></param>
        /// <returns></returns>
        public int DeleteTable(string tableName)
        {
            string query = $"DROP TABLE IF EXISTS {tableName};";
 
            return ExecuteNonQuery(query);
        }
        #endregion

        #region 增
        /// <summary>
        /// 添加数据
        /// </summary>
        /// <param name="ID"></param>
        /// <param name="type"></param>
        /// <param name="username"></param>
        /// <param name="password"></param>
        public void AddTableData(string ID, string type, string username, string password)
        {
            string sql = "insert into usermgr(ID,Type,UserName,Password) values('" + ID + "','" + type + "','" + username + "','" + password + "')";
            MySqlCommand cmd = new MySqlCommand(sql, msc);
            //返回更改数据行数
            int result = cmd.ExecuteNonQuery();
            Debug.Log("添加数据成功:"+ result);
        }
        #endregion
        
        #region 删
        /// <summary>
        /// 删除指定ID的数据
        /// </summary>
        /// <param name="ID"></param>
        public void DeleteTableData(string ID)
        {
            //删除的sql命令,这里是删除player中id=2的一行数据
            string sql = $"delete from usermgr where ID={ID}";                                     
            MySqlCommand cmd = new MySqlCommand(sql, msc);
            int result = cmd.ExecuteNonQuery();
            Debug.Log("删除数据成功:" + result);
        }
        #endregion
        
        #region 改
        /// <summary>
        /// 根据id去修改 用户类型 用户名 用户密码
        /// </summary>
        /// <param name="tableName"></param>
        /// <param name="ID"></param>
        /// <param name="username"></param>
        /// <param name="password"></param>
        public void AmendTableData(string ID, string type, string username, string password)
        {
            //更新
            string sql = $"update UserMgr set UserName='{username}',Password='{password}',Type='{type}' where ID={ID}";//更改的sql命令
            MySqlCommand cmd = new MySqlCommand(sql, msc);
            //返回值是数据库中修改的行数
            int result = cmd.ExecuteNonQuery();
            Debug.Log("更新数据成功:" + result);
        }
        #endregion
        
        #region 查
        /// <summary>
        /// 查找所有表中所有的数据
        /// </summary>
        public List<UserData> FindTableData()
        {
            string query = "SELECT * FROM usermgr";
            List<UserData> userDatas = new List<UserData>();
            using (MySqlCommand command = new MySqlCommand(query,msc))
            {
                using (MySqlDataReader reader = command.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        UserData data = new UserData();
                        data.id = int.Parse(reader.GetString("ID"));
                        data.type = int.Parse(reader.GetString("Type"));
                        data.username = reader.GetString("UserName");
                        data.password = reader.GetString("Password");
                        
                        //Debug.LogError(data.id + data.type + data.username + data.password);
                        
                        userDatas.Add(data);
                    }
                }
            }

            return userDatas;
        }
        #endregion

        public int ExecuteNonQuery(string SQLString)
        {
 
            using (MySqlCommand cmd = new MySqlCommand(SQLString, msc))
            {
                try
                {
                    int rows = cmd.ExecuteNonQuery();
                    return rows;
                }
                catch (MySqlException E)
                {
                    throw new Exception(E.Message);
                }
                finally
                {
                    //cmd.Dispose();
                }
            }
        }
    }
    
    /// <summary>
    /// 用户信息类
    /// </summary>
    public class UserData
    {
        public int id;
        public int type;
        public string username;
        public string password;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/550450.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Pytorch搭建GoogleNet神经网络

一、创建卷积模板文件 因为每次使用卷积层都需要调用Con2d和relu激活函数&#xff0c;每次都调用非常麻烦&#xff0c;就将他们打包在一起写成一个类。 in_channels&#xff1a;输入矩阵深度作为参数输入 out_channels: 输出矩阵深度作为参数输入 经过卷积层和relu激活函数…

AI:156-利用Python进行自然语言处理(NLP):情感分析与文本分类

本文收录于专栏&#xff1a;精通AI实战千例专栏合集 从基础到实践&#xff0c;深入学习。无论你是初学者还是经验丰富的老手&#xff0c;对于本专栏案例和项目实践都有参考学习意义。 每一个案例都附带关键代码&#xff0c;详细讲解供大家学习&#xff0c;希望可以帮到大家。正…

JDK5.0新特性

目录 1、JDK5特性 1.1、静态导入 1.2 增强for循环 1.3 可变参数 1.4 自动装箱/拆箱 1.4.1 基本数据类型包装类 1.5 枚举类 1.6 泛型 1.6.1 泛型方法 1.6.2 泛型类 1.6.3 泛型接口 1.6.4 泛型通配符 1、JDK5特性 JDK5中新增了很多新的java特性&#xff0c;利用这些新…

你的RPCvs佬的RPC

一、课程目标 了解常见系统库的hook了解frida_rpc 二、工具 教程Demo(更新)jadx-guiVS CodejebIDLE 三、课程内容 1.Hook_Libart libart.so: 在 Android 5.0&#xff08;Lollipop&#xff09;及更高版本中&#xff0c;libart.so 是 Android 运行时&#xff08;ART&#x…

计算机网络----第十二天

交换机端口安全技术和链路聚合技术 1、端口隔离技术&#xff1a; 用于在同vlan内部隔离用户&#xff1b; 同一隔离组端口不能通讯&#xff0c;不同隔离组端口可以通讯; 2、链路聚合技术&#xff1a; 含义&#xff1a;把连接到同一台交换机的多个物理端口捆绑为一个逻辑端口…

【前后端的那些事】SpringBoot 基于内存的ip访问频率限制切面(RateLimiter)

文章目录 1. 什么是限流2. 常见的限流策略2.1 漏斗算法2.2 令牌桶算法2.3 次数统计 3. 令牌桶代码编写4. 接口测试5. 测试结果 1. 什么是限流 限流就是在用户访问次数庞大时&#xff0c;对系统资源的一种保护手段。高峰期&#xff0c;用户可能对某个接口的访问频率急剧升高&am…

十大排序——6.插入排序

这篇文章我们来介绍一下插入排序 目录 1.介绍 2.代码实现 3.总结与思考 1.介绍 插入排序的要点如下所示&#xff1a; 首先将数组分为两部分[ 0 ... low-1 ]&#xff0c;[ low ... arr.length-1 ]&#xff0c;然后&#xff0c;我们假设左边[ 0 ... low-1 ]是已排好序的部分…

Spring Boot 多环境配置:YML 文件的三种高效方法

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

力扣:141. 环形链表

力扣&#xff1a;141. 环形链表 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾…

uni-app学习

目录 一、安装HBuilderX 二、创第一个uni-app 三、项目目录和文件作用 四、全局配置文件&#xff08;pages.json&#xff09; 4.1 globalStyle&#xff08;全局样式&#xff09; 导航栏&#xff1a;背景颜色、标题颜色、标题文本 导航栏&#xff1a;开启下拉刷新、下拉背…

LeetCode 409—— 最长回文串

阅读目录 1. 题目2. 解题思路3. 代码实现 1. 题目 2. 解题思路 要想组成回文串&#xff0c;那么只有最中间的字符可以是奇数个&#xff0c;其余字符都必须是偶数个。 所以&#xff0c;我们先遍历一遍字符串&#xff0c;统计出每个字符出现的次数。 然后如果某个字符出现了偶…

【数据分享】历次人口普查数据(一普到七普)

国之情&#xff0c;民之意&#xff0c;查人口&#xff0c;定大计。 第七次人口普查已经结束&#xff0c;那么&#xff0c;为了方便大家把七普数据与之前的数据做对比&#xff0c;地理遥感生态网整理了从一普到七普人口数据&#xff0c;并且把第七次人口普查的数据也一并分享给…

当全连接队列满了,tcp客户端收到服务端RST信令的模拟

当tcp服务端全连接队列满了后&#xff0c;并且服务端也不accept取出连接&#xff0c;客户端再次连接时&#xff0c;服务端能够看到SYN_RECV状态。但是客户端看到的是ESTABLISHED状态&#xff0c;所以客户端自认为成功建立了连接&#xff0c;故其写往服务端写数据&#xff0c;发…

JVM之本地方法栈和程序计数器和堆

本地方法栈 本地方法栈是为虚拟机执行本地方法时提供服务的 JNI&#xff1a;Java Native Interface&#xff0c;通过使用 Java 本地接口程序&#xff0c;可以确保代码在不同的平台上方便移植 不需要进行 GC&#xff0c;与虚拟机栈类似&#xff0c;也是线程私有的&#xff0c;…

C语言--函数递归

目录 1、什么是递归&#xff1f; 1.1 递归的思想 1.2 递归的限制条件 2. 递归举例 2.1 举例1&#xff1a;求n的阶乘 2.2 举例2&#xff1a;顺序打印⼀个整数的每⼀位 3. 递归与迭代 扩展学习&#xff1a; 早上好&#xff0c;下午好&#xff0c;晚上好 1、什么是递归&…

【鸿蒙开发】生命周期

1. UIAbility组件生命周期 UIAbility的生命周期包括Create、Foreground、Background、Destroy四个状态。 UIAbility生命周期状态 1.1 Create状态 Create状态为在应用加载过程中&#xff0c;UIAbility实例创建完成时触发&#xff0c;系统会调用onCreate()回调。可以在该回调中…

gcc常用命令指南(更新中...)

笔记为gcc常用命令指南&#xff08;自用&#xff09;&#xff0c;用到啥方法就具体研究一下&#xff0c;更新进去... 编译过程的分布执行 64位系统生成32位汇编代码 gcc -m32 test.c -o test -m32用于生成32位汇编语言

大学生前端学习第一天:了解前端

引言&#xff1a; 哈喽&#xff0c;各位大学生们&#xff0c;大家好呀&#xff0c;在本篇博客&#xff0c;我们将引入一个新的板块学习&#xff0c;那就是前端&#xff0c;关于前端&#xff0c;GPT是这样描述的&#xff1a;前端通常指的是Web开发中用户界面的部分&#xff0c;…

【读论文】【泛读】三篇生成式自动驾驶场景生成: Bevstreet, DisCoScene, BerfScene

文章目录 1. Street-View Image Generation from a Bird’s-Eye View Layout1.1 Problem introduction1.2 Why1.3 How1.4 My takeaway 2. DisCoScene: Spatially Disentangled Generative Radiance Fields for Controllable 3D-aware Scene Synthesis2.1 What2.2 Why2.3 How2.4…

解决QtCreator不能同时运行多个程序的方法

当我们运行QtCreator代码的时候&#xff0c;往往一个代码&#xff0c;可能需要打开好几个运行&#xff0c;但是会出现的情况就是&#xff0c;如果打开了一个界面&#xff0c;当我么再运行的时候&#xff0c;第一个界面就没有了&#xff0c;而且可能会出现终端报错的情况&#x…
最新文章