关于Unity3D 访问Access数据库的一点技巧
在开始这个教程之前,网上其实已经有不少相关资料了。不过,我还是想把自己实践过程中的一些经验分享出来。我的一位朋友在Unity 3D(以下简称U3D)的官网论坛找到一个访问Access数据库的示例代码(demo),但在使用时遇到了问题。我帮他解决后,为了避免其他朋友遇到类似问题,决定写这篇教程。
一、Access数据库简介
Access数据库是一款轻量级数据库,在学习.NET应用开发时,我们常常会接触到它。在PC软件开发中,如果数据存储量不大,Access是一个不错的选择,因为它不仅轻量级,而且易于部署。若想了解更多关于Access数据库的信息,可以访问微软的官方网站。
二、Unity3D访问Access数据库的准备工作
在U3D中访问Access数据库,需要用到两个必要的DLL文件:System.Data.dll 和 System.EnterpriseServices.dll。我们需要将这两个DLL文件放置到U3D项目的 Plugins 文件夹下。
三、创建Access数据库
我们创建一个2007版本的Access数据库,其文件后缀名为 .accdb(2003版本的Access数据库文件后缀名为 .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].ToString() + " | " + dt.Columns[1].ColumnName + " : " + dt.Rows[i][dt.Columns[1].ColumnName].ToString() + " | " + dt.Columns[2].ColumnName + " : " + dt.Rows[i][dt.Columns[2].ColumnName].ToString() + " | " + dt.Columns[3].ColumnName + " : " + dt.Rows[i][dt.Columns[3].ColumnName].ToString();
Debug.Log(dt.Columns[0].ColumnName + " : " + dt.Rows[i][dt.Columns[0].ColumnName].ToString() + " | " + dt.Columns[1].ColumnName + " : " + dt.Rows[i][dt.Columns[1].ColumnName].ToString() + " | " + dt.Columns[2].ColumnName + " : " + dt.Rows[i][dt.Columns[2].ColumnName].ToString() + " | " + dt.Columns[3].ColumnName + " : " + dt.Rows[i][dt.Columns[3].ColumnName].ToString());
}
}
}
public void OnGUI()
{
GUI.Label(new Rect(10, 10, 500, 200), text);
}
}
五、生成可执行文件及部署问题
生成可执行文件
完成代码编写后,我们生成一个可执行文件(exe)。执行完毕后,打开生成的程序可能会遇到一些问题。
部署问题及解决方法
在U3D中运行程序时,数据库文件显示正常,但生成可执行文件后却出现问题。这是因为在部署时,需要将数据库文件复制到生成的文件夹下。复制完成后,再次运行程序,即可看到正常的效果。
六、注意事项
在制作示例项目时,我遇到了一些问题,同时也进行了一些测试,总结出以下需要注意的地方:
- DLL文件完整性:访问Access数据库时,
System.Data.dll和System.EnterpriseServices.dll这两个DLL文件缺一不可,缺少任何一个都会导致程序出现问题。 - API兼容层级设置:在带有DLL动态链接库的项目中,打包时需要将API兼容层级设置为
.NET 2.0。 - 数据库版本与后缀名对应:使用不同版本的Access数据库时,要确保使用相应版本的后缀名(如
.mdb对应2003版本,.accdb对应2007及以上版本)。 - 数据库文件夹路径:如果想单独创建一个存放Access数据库的文件夹,在编写代码时需要准确找到该文件夹的路径。打包后,要将Access数据库文件放置到与代码中指定路径相对应的位置,否则程序将无法检测到数据库。
- 数据库文件名规范:创建数据库时要仔细检查文件名和后缀名,确保它们之间没有多余的空格,否则在U3D中运行时会提示未知文件。
- SQL语句准确性:SQL查询语句的拼写和标点符号必须正确,一个小错误可能会导致程序出现问题,排查起来会比较麻烦。
以上就是我关于Unity3D访问Access数据库的一些经验分享,希望能对大家有所帮助。如果有任何问题,欢迎一起交流探讨。