Unity2020连接MySQL数据库

这篇具有很好参考价值的文章主要介绍了Unity2020连接MySQL数据库。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

重新梳理一下这篇帖子(算是第三次较大变动的修正补充)。        

本文章涉及Unity 3D版本:2020.3.20f1、MySQL5.7。(经过亲测,2019-2022均适用)

1.作为初学者时期,发现与解决Unity连接MySQL问题的经过       

        前期为了让Unity连接MySQL,参考了许多帖子,瞎琢磨,安装了下图中的各包,其中MySQL-connector-net/-for-visualstudio的版本分别为8.0.27/1.2.10。

        参考帖子1:Unity连接Mysql数据库_Jessica的博客-CSDN博客_unity连接mysql数据库

Unity2020连接MySQL数据库

         这篇帖子,给了我很多指引,但也让我走了许多误区。我这使用的是2020版本,其中System.Data.dll和System.Drawing.dll在该版本中是内置的,所以导入这两个文件时,Unity会提示版本不对,dll重复的错误,如下图

Unity2020连接MySQL数据库

         导入MySql.Data.dll时也会出现许多错误,并且不同的版本,错误还不同!由于MySQL-connector-net版本我装的是8.0.27,里面的文件版本如下图:有net5.0/netstandard2.0/netstandard2.1/v4.5.2/v4.8

Unity2020连接MySQL数据库

         其中,不同版本的MySql.Data.dll所提示的错误也会有差异,如图:

        Unity2020连接MySQL数据库

Unity2020连接MySQL数据库

后续报错就不一一例举了。参考了许多帖子,当时就在想,既然不同版本的dll,报错还不同,那这大概率是dll版本不匹配的问题了,所以就挨个试版本,整个包的版本都试完了,都没解决问题。 

        这一系列的问题是在查阅到一篇帖子后才明白,Unity在18后续版本已经将这两引用集成到了内置文件中,参考帖子2:Unity2018连接MySQL数据库_ZLX的博客-CSDN博客,根据参考贴,在VS中检查项目引用,如果有System.Data.dll和System.Drawing.dll两文件,就不必添加dll了。

        MySql.Data.dll导入报错的问题,在于MySQL-connector-net包的版本过高,Unity不兼容,下载低版本的connector/net包就能解决。根据参考贴,我去甲骨文官网下载了6.3.9版本的包,下载地址:MySQL :: Download MySQL Connector/NET (Archived Versions)(下载时选择需要的版本即可),把6.3.9压缩包解压后,得到的myql.data.dll文件导入Unity2020,之前的错误就完全消失了。

Unity2020连接MySQL数据库

       总结一下:

  1. Unity与MySQL的连接,使用MySQL .NET Connector作为连接工具时,需要注意MySQL-connector-net的版本,过高的版本与Unity不兼容,会出现缺失依赖集、无法引用等报错,本文章使用的是6.3.9版本。
  2. 有的帖子有提及System.Data.dll和System.Drawing.dll两个文件,Unity 2018版本后的开发环境不用关注这个,已内置。
  3. (补充说明)把项目工程打包导出后运行,会发现依旧无法连接数据库,这主要是缺失dll导致,导入I18N.CJK.dll/I18N.dll/I18N.MidEast.dll/I18N.West.dll到Plugins就能解决,这几个文件一般在Unity编辑器安装文件夹中,eg:C:\Program Files\Unity\Hub\Editor\2020.3.27f1c1\Editor\Data\MonoBleedingEdge\lib\mono
  4. (注意)这是我后续开发遇到的问题,以上所述,均是连接本地数据库,至于连接远程数据库,后续有其他方案解决。

2.具体的连接代码

        1.简单的连接测试版

        简单暴力速度,直接挂载脚本运行完事

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using MySql.Data.MySqlClient;

public class DatabaseConnection : MonoBehaviour
{
    private MySqlConnection connection;

    private string server = "服务器地址";
    private string database = "数据库名称";
    private string uid = "用户名";
    private string password = "密码";

    void Start()
    {
        string connectionString = "SERVER=" + server + ";" + "DATABASE=" +
            database + ";" + "UID=" + uid + ";" + "PASSWORD=" + password + ";";

        connection = new MySqlConnection(connectionString);

        try
        {
            connection.Open();
            Debug.Log("连接成功!");
        }
        catch (MySqlException ex)
        {
            Debug.Log("连接失败:" + ex.Message);
        }
    }

    void OnApplicationQuit()
    {
        if (connection != null)
        {
            connection.Close();
            Debug.Log("关闭连接!");
        }
    }
}

        2.参考其他帖子,附带查询的连接方法

        dll的错误消失后,得检擦是否能正常连接MySQL数据库,连接代码我复制的参考贴2里的两个脚本,根据自己数据库的表,改了些许代码,成功实现了数据库连接,效果图如下:

       Unity2020连接MySQL数据库

        剩下数据库连接的内容,可根据自己数据库实况来写脚本连接检测。我这直接改的参考贴2的代码,下面针对数据库表及代码,给个参考。 

        自己数据库中表内容:

Unity2020连接MySQL数据库

         参考贴2代码——SqlAccess:公共方法类

using System;
using System.Data;
using MySql.Data.MySqlClient;
using UnityEngine;
using System.Text;

public class SqlAccess
{
	public static MySqlConnection dbConnection;
	//如果只是在本地的话,写localhost就可以。
	// static string host = "localhost";  
	//如果是局域网,那么写上本机的局域网IP
	static string host = "localhost";
	static string port = "3306";
	static string username = "root";
	static string pwd = "admin";
	static string database = "mygamedb";

	public SqlAccess()
	{
		OpenSql();
	}

	/// <summary>
	/// 连接数据库
	/// </summary>
	public static void OpenSql()
	{
		try
		{
			string connectionString = string.Format("server = {0};port={1};database = {2};user = {3};password = {4};", host, port, database, username, pwd);
			Debug.Log(connectionString);
			dbConnection = new MySqlConnection(connectionString);
			dbConnection.Open();
			Debug.Log("建立连接");
		}
		catch (Exception e)
		{
			throw new Exception("服务器连接失败,请重新检查是否打开MySql服务。" + e.Message.ToString());
		}
	}

	/// <summary>
	/// 关闭数据库连接
	/// </summary>
	public void Close()
	{
		if (dbConnection != null)
		{
			dbConnection.Close();
			dbConnection.Dispose();
			dbConnection = null;
		}
	}

	/// <summary>
	/// 查询
	/// </summary>
	/// <param name="tableName">表名</param>
	/// <param name="items"></param>
	/// <param name="col">字段名</param>
	/// <param name="operation">运算符</param>
	/// <param name="values">字段值</param>
	/// <returns>DataSet</returns>
	public DataSet SelectWhere(string tableName, string[] items, string[] col, string[] operation, string[] values)
	{

		if (col.Length != operation.Length || operation.Length != values.Length)
			throw new Exception("col.Length != operation.Length != values.Length");

		StringBuilder query = new StringBuilder();
		query.Append("SELECT ");
		query.Append(items[0]);

		for (int i = 1; i < items.Length; ++i)
		{
			query.Append(", ");
			query.Append(items[i]);
		}

		query.Append(" FROM ");
		query.Append(tableName);
		query.Append(" WHERE 1=1");

		for (int i = 0; i < col.Length; ++i)
		{
			query.Append(" AND ");
			query.Append(col[i]);
			query.Append(operation[i]);
			query.Append("'");
			query.Append(values[0]);
			query.Append("' ");
		}
		Debug.Log(query.ToString());
		return ExecuteQuery(query.ToString());
	}

	/// <summary>
	/// 执行sql语句
	/// </summary>
	/// <param name="sqlString">sql语句</param>
	/// <returns></returns>
	public static DataSet ExecuteQuery(string sqlString)
	{
		if (dbConnection.State == ConnectionState.Open)
		{
			DataSet ds = new DataSet();
			try
			{
				MySqlDataAdapter da = new MySqlDataAdapter(sqlString, dbConnection);
				da.Fill(ds);
			}
			catch (Exception ee)
			{
				throw new Exception("SQL:" + sqlString + "/n" + ee.Message.ToString());
			}
			finally
			{
			}
			return ds;
		}
		return null;
	}
}

        参考贴2代码——TestSql:把这个脚本挂在到场景物体中,即可执行。

using System.Data;
using UnityEngine;

public class TestSql : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        SqlAccess sql = new SqlAccess();
        string[] items = { "idrole", "name", "level", "roletype", "userid"};//更改元素,与自己表对应
        string[] col = { };
        string[] op = { };
        string[] val = { };
        DataSet ds = sql.SelectWhere("role", items, col, op, val);//读取表,此处把表名改为自己需要查询的表

        if (ds != null)
        {
            DataTable table = ds.Tables[0];
            foreach (DataRow row in table.Rows)
            {
                string str = "";
                foreach (DataColumn column in table.Columns)
                    str += row[column] + " ";
                Debug.Log(str);
            }
        }
    }
}

3.MySQL+PHP 解决远程数据库连接的问题

        该篇帖子内容均是基于连接本地数据库所撰写,个人在后续的项目实践中,一直未能实现 .NET Connector方法的远程数据库连接,在同一本地服务器中,我使用MySQL 客户端或其他工具尝试连接到远程数据库,均没有问题,但在Unity中就不能实现对远程数据库的连接。

        在经过多次尝试无果后,我这更换了技术路线,使用PHP+MySQL的技术路线成功解决了连接远程数据库的问题。有感兴趣的可以了解一下,对不足之处也望多提建议:Unity + PHP + MySQL连接技术简介_unity和mysql连接-CSDN博客。

4.MySQL8.0链接Unity

        简述:在这里我需要补充修正一下之前的内容,之前我说过Unity不兼容MySQL8.0,两者连不上,但是前段时间,在一位大佬的指点下,我这实现了Unity链接MySQL8.0的案例,不过后续在实际的开发过程中,发现两者真的无法兼容,主要原因是Unity不支持新的MySql.Data.dll,只能通过老的(6.3版本前的.NET Connector)MySql.Data.dll进行链接,这就出现了两个非常严重的问题——①MySql.Data.dll需要大量的关联dll。②MySQL8.0新字符集等新规则与老的MySql.Data.dll之间不兼容。直接进入正题。

4.1 MySQL8.0链接Unity的方法

        (1)使用老版的MySql.Data.dll

        MySQL8.0链接Unity,大家在将新版的MySql.Data.dll放到Unity工程中时,会出现版本提示相关的报错(这里先不用关注其他报错),这是目前Unity不支持新版MySql.Data.dll的原因,因此这里需要换成老版MySql.Data.dll,将版本报错这条消息解决。

        (2)其他报错的解决

        换成老版的dll后,会出现其他的报错信息,通常来说报错主要是说缺失某某dll,只要按提示将这些缺失的dll一个个补上,就能解决这个问题。如何去找到这些缺失的dll文件呢?这里大家打开VS,最好单独新建一个VS项目,在VS中使用NuGet,根据Unity中的提示按名字将对应的dll下载到项目中,最后再在项目文件夹中找到dll(通常运行一下项目,会在项目debug文件夹中生成相关dll),移入Unity。最终,我也是在关联了差不多20+dll终于是把Unity的报错全解决了,后面我会单独将找到的dll文件汇总打包上传,有需要的网友直接下载放到Unity中就行。

Unity2020连接MySQL数据库

        后面经过亲测,在dll补齐后,unlty链接MySQL8.0无论是本地链接还是远程链接,均能连接上数据库。

 4.2 该方法存在的问题

        简述中说了,该方法存在两个致命的问题:①MySql.Data.dll需要大量的关联dll。②MySQL8.0新字符集等新规则与老的MySql.Data.dll之间不兼容。

        ①MySql.Data.dll需要大量的关联dll:

        这个问题十分致命,大家如果按照该方法解决掉所有报错后,在开发过程中大概率会出现编写代码后,编辑器半天更新加载不上,反应不过来,这时候别认为是自己机器性能不够(我这试过换设备,最后i7-13700k+4070ti一样干不动),就算你这时候项目中没一个模型,就写了一句代码,编辑器也可能会更新不上,这主要是Unity中加载的dll过多,导致编辑器无法正常的工作。

        ②MySQL8.0新字符集等新规则与老的MySql.Data.dll之间不兼容

        这是另一个十分致命的问题,在具体进行数据查询的时候,会提示你字符编码格式相关的报错,你要是查询的字段是纯数字或者字符,这问题一般不会出来,但是涉及到其他字符,如中文字符时,会报错,这问题我个人分析主要是使用了老的MySql.Data.dll,不支持MySQL8.0的新编码格式,但是新的dll在Unity中又不支持,直接让我无解了,头铁了一段时间尝试去解决这问题,最后直接放弃在开发中使用MySQL8.0了......

暂时就说到这了,文章有错误或不足之处,也望大家多多指出,后续有新的进展也会持续更新。文章来源地址https://www.toymoban.com/news/detail-424413.html

到了这里,关于Unity2020连接MySQL数据库的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity连接数据库mysql全过程+可能遇到的问题与解决方案

    目录 一、具备条件 二、unity连接mysql 三、问题总结 1. Mysql安装完成         安装完成后需要查看mysql的版本,打开终端(管理者身份运行),输入以下语句登录mysql,查看MySQL版本; 可以看到我下载的版本是 5.7.38; 2. MySQL Connector/NET下载 目的:为了搭建unity连接mysql的环境

    2024年02月03日
    浏览(66)
  • 【数据库通关之路】 MySQL 全路线学习知识点梳理(下)

    本文是MYSQL零基础小白学习系列的第三篇文章,点此阅读 上一篇文章 文末 包邮随机送《MySQL数据库进阶实战 》 五本 (点击下方目录直达) 目的:主键是一行数据的唯一标识,要求非空且唯一 添加约束: 建完表后添加主键约束: 删除约束: 目的:保存数据时,未指定值则采

    2024年02月04日
    浏览(58)
  • 【数据库通关之路】 MySQL 全路线学习知识点梳理(中)

    本文是 MYSQL零基础小白学习 系列的第二篇文章,点此阅读 上一篇文章 文末包邮送《分布式中间件核心原理与RocketMQ最佳实践 》 (点击下方目录直达)一本,本文每+1000浏览额外加抽一人 需求 :设计包含如下信息的学生表,请注重数据类型、长度的合理性。 编号 姓名,姓名最

    2023年04月20日
    浏览(45)
  • 【数据库通关之路】 MySQL 全路线学习知识点梳理(上)

    这是一篇 MySQL 通关 硬核经验学习路线,包括数据库相关知识,SQL语句的使用,数据库约束,设计等。专为小白整理,针对数据库零基础的朋友们,手把手带你学习MySQL,让你轻松学会! 文末包邮送《WPS Office高效办公:数据处理与分析 》1本(点击下方目录直达),本文每+1000浏览

    2024年02月04日
    浏览(45)
  • 【MySQL】使用DBeaver数据库管理工具进行MySQL数据库连接

    一、数据库连接信息填写 1、服务器地址:填写服务器部署的地址,以及端口号 2、数据库:sys 3、用户名:root 4、密码:服务器上面设置的具体密码 以上信息填写错误的报错提示 :Access denied for user ‘XXX’@’%’ to database ‘10.42.67.22’ 二、数据库说明 1、数据库连接时选择的

    2024年02月09日
    浏览(91)
  • MySQL数据库,JDBC连接数据库操作流程详细介绍

    在学完 MySQL 和 Java 后,我们通常会尝试使用 Java编译器 连接 MySQL数据库,从而达到使用编译器来操作数据库的效果。连接的这个过程会用 JDBC 相关知识,因此我把 JDBC 包的下载及导入流程,以及 JDBC 的使用流程整理下来分享给大家。 目录 1. 啥是JDBC? 2. JDBC依赖包 2.1 依赖包

    2024年02月06日
    浏览(104)
  • Mysql查询数据库连接状态及连接信息

    使用MySQL时,需要了解当前数据库的情况,例如当前的数据库大小、字符集、用户等等。下面总结了一些查看数据库相关信息的命令 查看显示所有数据库 查看当前使用的数据库 查看数据库使用端口 查看当前数据库大小 例如,我要查看INVOICE数据库的大小,那么可以通过下面

    2024年02月11日
    浏览(57)
  • mysql面试题30:什么是数据库连接池、应用程序和数据库建立连接的过程、为什么需要数据库连接池、你知道哪些数据库连接池

    该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 数据库连接池是一种用于管理和复用数据库连接的技术。它是在应用程序和数据库之间建立一组数据库连接,并以池的形式存储起来,每当应用程序需

    2024年02月07日
    浏览(58)
  • scala连接mysql数据库

    scala中通常是通过JDBC组件来连接Mysql。JDBC, 全称为Java DataBase Connectivity standard。 加载依赖 其中包含 JDBC driver 1.1 spark组件直接连接(推荐) 通过spark.read直接连接,直接得到dataframe 注意:driver的类名根据不同的JDBC版本不同,早一些的版本为 com.mysql.jdbc ,而不是 com.mysql.cj.jdbc

    2024年02月13日
    浏览(39)
  • Python 连接 MySQL 数据库

    在实际数据分析和建模过程中,我们通常需要从数据库中读取数据,并将其转化为 Pandas dataframe 对象进行进一步处理。而 MySQL 数据库是最常用的关系型数据库之一,因此在 Python 中如何连接 MySQL 数据库并查询数据成为了一个重要的问题。 本文将介绍两种方法来连接 MySQL 数据

    2024年02月16日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包