Unity2020连接MySQL数据库

        本文章涉及Unity 3D版本:2020.3.20f1、MySQL5.7。

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

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

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

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

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

        

 

后续报错就不一一例举了。参考了许多帖子,当时就在想,既然不同版本的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,之前的错误就完全消失了。

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

       

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

        自己数据库中表内容:

         参考贴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 = "921490518";
	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);
            }
        }
    }
}

        连接成功,未对编译后情况作追踪。后续有新情况,会继续对这一问题跟进并更新。


文章标签:

原文连接:https://blog.csdn.net/weixin_43822095/article/details/121025014

相关推荐

【Unity学习笔记】掌握MoneBehavior中的重要属性、方法

零基础教你Unity集成IOS原生本地推送

Unity_Demo | 中世纪风3D-RPG游戏

【Unity基础知识】基础游戏单位GameObject中常用的属性和API

Unity中文版?脚本也用中文?用中文写了个剧情小游戏,真好玩~

Unity3D学习笔记9——加载纹理

Unity制作 小球吃金币 游戏

UnityHub破解&Unity破解

Unity3D学习笔记8——GPU实例化(3)

unity3d俯视角简易移动控制脚本及其易错点小分享

Unity3D学习笔记7——GPU实例化(2)

Unity3D学习笔记6——GPU实例化(1)

12 岁印度少年出手,Ubuntu Unity 桌面 6 年后起死回生

Unity3D学习笔记4——创建Mesh高级接口

GameFramework食用指南

【Unity3D】相机跟随

Unity移动端游戏性能优化简谱之 CPU耗时调优

Unity初学者肯定能用得上的50个小技巧

Unity移动端游戏性能优化简谱之 前言

UnityShader入门精要个人总结--基础篇(一)