Unity3D 访问Access数据库。
在开始这个教程之前,网上其实已有相关资料,但我仍想分享自己练习时的经验。写此教程的起因是一位朋友在U3D官网论坛找到相关demo,使用时遇到问题,我帮他解决后,为避免其他朋友遇到同类问题,特此撰写。闲话不多说,下面正式开始教程。
一、Access数据库简介
Access数据库是轻量级数据库,在学习.NET应用开发时会有所接触。在PC软件开发中,当存储数据量不大时,常选择Access数据库,因其具有轻量级、易部署的特点。更多关于Access数据库的信息,可前往微软官网查看。
二、Unity3D访问Access数据库的准备工作
在U3D中访问Access数据库,需要用到两个必要的DLL文件:System.Data.dll和System.EnterpriseServices.dll。需将这两个DLL文件放置在U3D的Plugins文件夹下。
三、创建Access数据库
创建一个Access数据库,这里以07版本(文件后缀为.accdb)为例,03版本的文件后缀为.mdb。在编写代码时,要根据不同的数据库版本选择对应的文件后缀名,否则会提示数据库文件为未知文件。
四、读取Access数据库的示例代码
以下是一个读取Access数据库的示例代码,其他如修改、添加数据等操作主要是修改SQL语句。关于Access在.NET中进行CURD操作的相关知识,可进一步查阅资料。
/*
* |-------------------------------------------
* |作者:Mr.野猪
* |
* |时间:2012/09/26 晚:23:56
* |
* |目的:用于技术交流
* |------------------------------------------
*/
using UnityEngine;
using System.Collections;
//引入命名空间
using System;
using System.Data;
using System.Data.Odbc;
public class RaderData : MonoBehaviour
{
/// <summary>
/// 声明一个接受读取数据字段值的变量
/// </summary>
string text = string.Empty;
public void Start()
{
//读取数据文件。
ReadStudent(Application.dataPath + "/Wild boar.accdb");
}
/// <summary>
/// 读取表数值的函数
/// </summary>
/// <param name="filetoread">数据文件的路径</param>
internal void ReadStudent(string filetoread)
{
//声明连接数据库的字段
string connection = "Driver={Microsoft Access Driver (*.mdb, *.accdb)}; DBQ=" + filetoread;
//从表中查询所有数据
string sqlQuery = "select * from Student";
//打开数据库
OdbcConnection con = new OdbcConnection(connection);
//对数据库进行操作
OdbcCommand cmd = new OdbcCommand(sqlQuery, con);
//根据表名,读取数据到一个临时表
DataTable dt = new DataTable("Student");
//try catch finally进行了异常处理,这是好习惯
try
{
//打开数据库
con.Open();
//读取数据
OdbcDataReader reader = cmd.ExecuteReader();
//把数据加载到临时表
dt.Load(reader);
//在使用完毕之后,一定要关闭,否则会出问题
reader.Close();
//关闭数据库
con.Close();
}
catch (Exception ex)
{
Debug.Log(ex.ToString());
}
finally
{
//判断数据库是否打开,如果打开就关闭。
if (con.State != ConnectionState.Closed)
{
con.Close();
}
//释放数据库资源
con.Dispose();
}
if (dt.Rows.Count > 0)
{
//读取数据
for (int i = 0; i < dt.Rows.Count; i++)
{
text = $"{dt.Columns[0].ColumnName} : {dt.Rows[i][dt.Columns[0].ColumnName]} | {dt.Columns[1].ColumnName} : {dt.Rows[i][dt.Columns[1].ColumnName]} | {dt.Columns[2].ColumnName} : {dt.Rows[i][dt.Columns[2].ColumnName]} | {dt.Columns[3].ColumnName} : {dt.Rows[i][dt.Columns[3].ColumnName]}";
Debug.Log(text);
}
}
}
public void OnGUI()
{
GUI.Label(new Rect(10, 10, 500, 200), text);
}
}
五、生成exe文件及部署问题
生成exe文件后,可能会遇到一些问题。在U3D中能正常显示数据,但运行生成的程序时可能出现异常。这是因为在部署时,需要将数据库文件复制到生成的文件夹下,再次运行程序即可正常查看效果。
六、注意事项
在制作demo过程中,有以下几点需要注意:
- DLL文件完整性:访问Access数据库时,System.Data.dll和System.EnterpriseServices.dll这两个DLL文件缺一不可,缺少会导致程序出现问题。
- API兼容层级设置:在带有DLL动态链接库的项目中,打包时需将API兼容层级设置为.NET 2.0。
- 数据库版本与后缀名对应:使用不同版本的Access数据库,要对应相应的后缀名,如03版本为.mdb,07版本为.accdb。
- 数据库文件位置:若单独创建存放Access数据库的文件夹,在编写代码时需准确找到该文件夹路径,打包后将数据库文件放置在代码对应位置,否则程序将无法检测到数据库。
- 数据库文件命名规范:创建数据库时要认真,文件名字和后缀名之间不能有多余空格,否则在U3D中运行会提示未知文件,导致数据读取失败。
- SQL语句正确性:SQL查询语句的拼写和标点符号必须正确,一个小错误可能会导致程序出现问题,排查起来会比较麻烦。