最近MOMO身心疲惫。。今天是周末在家无聊我还是决定来学习。不知道学什么,就学MySQL吧。本篇主要记录从MySQL安装到局域网内任意机器连接数据库,也算是对自己学习的总结。今天我没用Mac电脑,而是选择Windows,没有别有用心,而是想熟悉一下Windows下操作Unity。
官网上下载MySQL的安装程序,这里有一篇详细的安装文章,http://www.jb51.net/article/23876.htm 为了让中文完美的运行,配置MySQL的时候Character Set处设置成UTF-8,好像默认是不能显示中文。配置完毕后就可以在本机中启动MySQL,也可以在cmd命令行中start和stop 启动与关闭MySQL。
1 2 |
net start mysql net stop mysql |
为了让本机MySQL数据库可以在局域网中任意机器都可以访问,请看 下面这个网址。
http://dzb3688.blog.163.com/blog/static/105068522201292671444891/
文章有一点点讲的不是很清楚,所以我在补充一下、
我用的是Navicat Pewmium查看数据库,我觉得这个数据库挺好的,因为我在Mac上也是用的这个数据库 。(大家可以在网络上下载它,Windows版本居然有汉化的)如下图所示,点击用户,然后双击”root@%” 最后把主机的名字改成 “%”即可、
下面就是重点了,打开cmd 窗口cd到MySQL的路径下,一定要cd到这个路径下,不然mysql 会是无法识别的指令噢。
然后执行命令:
mysql grant all privileges on *.* to root@”%” identified by ‘abc’ with grant option;
flush privileges;
在执行命令:
mysql flush privileges;
OK这样就行了。
然后开始看看代码怎么写,为了方便数据库的创建、增加、删除、修改、查询、我封装了一个类。欢迎大家测试 啦啦啦啦。
SqlAccess.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 |
using UnityEngine; using System; using System.Data; using System.Collections; using MySql.Data.MySqlClient; using MySql.Data; using System.IO; public class SqlAccess { public static MySqlConnection dbConnection; //如果只是在本地的话,写localhost就可以。 // static string host = "localhost"; //如果是局域网,那么写上本机的局域网IP static string host = "192.168.1.106"; static string id = "root"; static string pwd = "1234"; static string database = "xuanyusong"; public SqlAccess() { OpenSql(); } public static void OpenSql() { try { string connectionString = string.Format("Server = {0};port={4};Database = {1}; User ID = {2}; Password = {3};",host,database,id,pwd,"3306"); dbConnection = new MySqlConnection(connectionString); dbConnection.Open(); }catch (Exception e) { throw new Exception("服务器连接失败,请重新检查是否打开MySql服务。" + e.Message.ToString()); } } public DataSet CreateTable (string name, string[] col, string[] colType) { if (col.Length != colType.Length) { throw new Exception ("columns.Length != colType.Length"); } string query = "CREATE TABLE " + name + " (" + col[0] + " " + colType[0]; for (int i = 1; i < col.Length; ++i) { query += ", " + col[i] + " " + colType[i]; } query += ")"; return ExecuteQuery(query); } public DataSet CreateTableAutoID (string name, string[] col, string[] colType) { if (col.Length != colType.Length) { throw new Exception ("columns.Length != colType.Length"); } string query = "CREATE TABLE " + name + " (" + col[0] + " " + colType[0] + " NOT NULL AUTO_INCREMENT"; for (int i = 1; i < col.Length; ++i) { query += ", " + col[i] + " " + colType[i]; } query += ", PRIMARY KEY ("+ col[0] +")" + ")"; Debug.Log(query); return ExecuteQuery(query); } //插入一条数据,包括所有,不适用自动累加ID。 public DataSet InsertInto (string tableName, string[] values) { string query = "INSERT INTO " + tableName + " VALUES (" + "'"+ values[0]+ "'"; for (int i = 1; i < values.Length; ++i) { query += ", " + "'"+values[i]+ "'"; } query += ")"; Debug.Log(query); return ExecuteQuery (query); } //插入部分ID public DataSet InsertInto (string tableName, string[] col,string[] values) { if (col.Length != values.Length) { throw new Exception ("columns.Length != colType.Length"); } string query = "INSERT INTO " + tableName + " (" + col[0]; for (int i = 1; i < col.Length; ++i) { query += ", "+col[i]; } query += ") VALUES (" + "'"+ values[0]+ "'"; for (int i = 1; i < values.Length; ++i) { query += ", " + "'"+values[i]+ "'"; } query += ")"; Debug.Log(query); return ExecuteQuery (query); } 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"); } string query = "SELECT " + items[0]; for (int i = 1; i < items.Length; ++i) { query += ", " + items[i]; } query += " FROM " + tableName + " WHERE " + col[0] + operation[0] + "'" + values[0] + "' "; for (int i = 1; i < col.Length; ++i) { query += " AND " + col[i] + operation[i] + "'" + values[0] + "' "; } return ExecuteQuery (query); } public DataSet UpdateInto (string tableName, string []cols,string []colsvalues,string selectkey,string selectvalue) { string query = "UPDATE "+tableName+" SET "+cols[0]+" = "+colsvalues[0]; for (int i = 1; i < colsvalues.Length; ++i) { query += ", " +cols[i]+" ="+ colsvalues[i]; } query += " WHERE "+selectkey+" = "+selectvalue+" "; return ExecuteQuery (query); } public DataSet Delete(string tableName,string []cols,string []colsvalues) { string query = "DELETE FROM "+tableName + " WHERE " +cols[0] +" = " + colsvalues[0]; for (int i = 1; i < colsvalues.Length; ++i) { query += " or " +cols[i]+" = "+ colsvalues[i]; } Debug.Log(query); return ExecuteQuery (query); } public void Close() { if(dbConnection != null) { dbConnection.Close(); dbConnection.Dispose(); dbConnection = null; } } 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; } } |
然后在来看看调用,把如下脚本绑定在任意对象即可,调用包括、创建表、插入信息、查找信息、删除信息、更新信息。代码比较简单我就不一一注释了,这里我用try catch如果有错误信息将打印在屏幕中。 创建表包括是否递增ID,所以有两种创建表的方式。如果你的数据库是提前预制的话可以这样来读取数据库。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
using UnityEngine; using System; using System.Data; using System.Collections; using MySql.Data.MySqlClient; using MySql.Data; using System.IO; public class NewBehaviourScript : MonoBehaviour { string Error = null; void Start () { try { SqlAccess sql = new SqlAccess(); sql.CreateTableAutoID("momo",new string[]{"id","name","qq","email","blog"}, new string[]{"int","text","text","text","text"}); //sql.CreateTable("momo",new string[]{"name","qq","email","blog"}, new string[]{"text","text","text","text"}); sql.InsertInto("momo",new string[]{"name","qq","email","blog"},new string[]{"xuanyusong","289187120","xuanyusong@gmail.com","xuanyusong.com"}); sql.InsertInto("momo",new string[]{"name","qq","email","blog"},new string[]{"ruoruo","34546546","ruoruo@gmail.com","xuanyusong.com"}); DataSet ds = sql.SelectWhere("momo",new string[]{"name","qq"},new string []{"id"},new string []{"="},new string []{"1"}); if(ds != null) { DataTable table = ds.Tables[0]; foreach (DataRow row in table.Rows) { foreach (DataColumn column in table.Columns) { Debug.Log(row[column]); } } } sql.UpdateInto("momo",new string[]{"name","qq"},new string[]{"'ruoruo'","'11111111'"}, "email", "'xuanyusong@gmail.com'" ); sql.Delete("momo",new string[]{"id","email"}, new string[]{"1","'000@gmail.com'"} ); sql.Close(); }catch(Exception e) { Error = e.Message; } } // Update is called once per frame void OnGUI () { if(Error != null) { GUILayout.Label(Error); } } } |
然后是用到的dll 一个都不能少,不然会出现各种问题。最后的下载地址我会给出,并且包含这些文件。
为了测试局域网的连接, 我还编译到了Android手机上,在Android上访问这个数据库,也是没问题的。当然手机和电脑用的是同一个wifi网络。 目前这个项目在 Windows 和 Android上都可以很好的运行,我感觉在Mac上和iPhone上应该也木有问题,欢迎大家测试,如果发现在别的平台下有问题请告诉我,我会进一步研究的。 欢迎大家留言,一起学习啦啦啦啦 嘿嘿嘿~~。。
下载地址:http://vdisk.weibo.com/s/B5ac9
- 本文固定链接: https://www.xuanyusong.com/archives/2326
- 转载请注明: 雨松MOMO 于 雨松MOMO程序研究院 发表
大家可以尝试改一下Api Compatibility level*,我的是unity2018.3.14,mysql8.0的,修改了这个就ok了。
能出个mysql8.0的教程吗
请问有人解决了Unity上可以运行,但打包apk安装之后手机无法连接数据库的问题吗???
在加一个I18.CJK的库
请问你解决了吗?我也遇到同样的问题
你好,这个demo下载不了,可否发我邮箱?
这种unity直接操作数据库 可以拿到增删改的回调么
你好 , 我下载的你的源码导入, Unity 5.4.6, 在编辑器运行正常, 但是发布exe 时候, 出现
ReflectionTypeLoadException: The classes in the module cannot be loaded.
System.Reflection.Assembly.GetTypes () (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Reflection/Assembly.cs:371)
UnityEditor.AttributeHelper+c__Iterator3
1[System.Collections.Generic.IEnumerable
1[UnityEditorInternal.PluginDesc]].MoveNext () (at C:/buildslave/unity/build/Editor/Mono/AttributeHelper.cs:277)UnityEditor.PluginImporter+c__Iterator0.MoveNext () (at C:/buildslave/unity/build/Editor/Mono/PluginImporter.cs:41)
DesktopStandalonePostProcessor.CopyNativePlugins () (at C:/buildslave/unity/build/Editor/Mono/BuildPipeline/DesktopStandalonePostProcessor.cs:116)
DesktopStandalonePostProcessor.SetupStagingArea () (at C:/buildslave/unity/build/Editor/Mono/BuildPipeline/DesktopStandalonePostProcessor.cs:145)
DesktopStandalonePostProcessor.PostProcess () (at C:/buildslave/unity/build/Editor/Mono/BuildPipeline/DesktopStandalonePostProcessor.cs:23)
UnityEditor.WindowsStandalone.WindowsDesktopStandalonePostProcessor.PostProcess (BuildPostProcessArgs args) (at C:/buildslave/unity/build/PlatformDependent/WinPlayer/Extensions/Managed/WindowsDesktopStandalonePostProcessor.cs:118)
UnityEditor.PostprocessBuildPlayer.Postprocess (BuildTarget target, System.String installPath, System.String companyName, System.String productName, Int32 width, Int32 height, System.String downloadWebplayerUrl, System.String manualDownloadWebplayerUrl, BuildOptions options, UnityEditor.RuntimeClassRegistry usedClassRegistry, UnityEditor.BuildReporting.BuildReport report) (at C:/buildslave/unity/build/Editor/Mono/BuildPipeline/PostprocessBuildPlayer.cs:176)
UnityEditor.HostView:OnGUI()
这个要怎么设置呢
我也出现了这个问题,请问怎么解决啊
那个system.drawing.dll 换个 .net3.5的库就可以打包了
雨松老师 求问在WINDOWS系统下U3D测试环境下都连MYSQL库测试正常,可是转到安卓发布出APK来,结果都无法连接到库,I18等DLL 文件 以及.NET设置都OK的一直没有找到问题啊会不会和我引入的VUFOIRA的包有冲突还是怎么着这个问题纠结3天了
我也是您这种情况,同样是导入了Vuforia,请问您解决了吗?
解决了么 我也是这个问题
您好,我和您遇到了同样的问题,我也导入了Vuforia的包,同样也是unity下运行正常,但是打包apk安装后没办法连接Mysql。请问您现在解决了吗?
感谢博主分享!另外说下我碰到的问题,如果有人碰到相同的问题希望有所帮助看了博主的分享之后我自己做了个简陋的登陆界面在编辑器时测试时毫无问题但发布到Android真机上之后无法使用登录功能写了个try catch把发生的错误输出了出来发现是这样的描述“Encoding name ‘gb2312’ not supported”问题出现在select也就是查询时百度过后有人说这是MySQL.data的问题 但更换了几个版本也没有解决后来我突发奇想直接跑到EditorDataMonolibmono2.0文件夹下将I18开头的几个dll通通导入到项目plugins下再次发布到手机上问题就解决了
本地u3d测试都没问题 发布成apk就无法连库了
发布到Android出现问题:ReflectionTypeLoadException: The classes in the module cannot be loaded.System.Reflection.Assembly.GetTypes () (at /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System.Reflection/Assembly.cs:371)把System.Drawing.dll去掉,选择.net 2.0就可以发布了
增删改 可以添加回调么