Unity3D 访问Access数据库

Unity3D 访问Access数据库

在开始这个小教程之前呢,其实在网上你已经可以找到相关的资料了,但是我还是要把我自己做练习的一点东西分享出来。写这个教程的主要原因呢,是一个朋友在u3d的官网论坛里,找到了这个demo,但是在他使用的过程中遇到了问题,我看了给他解决掉之后,为了其他朋友不至于发生同类的问题,特在此唠叨一番。在开始主题之前呢,我真的想说,北京的公交太不给力了,我这几天,每次等公交都要一个多小时,直接崩溃中。好,闲话不扯啦!下面开始我的教程之旅吧!

Access数据库呢,是一个轻量级的数据库,以前在学习.net应用开发的时候了解过。在pc的软件开发中,很多时候,我们存储的数据量不会很大的情况都会选择他,主要他轻量级,容易部署。更多Access的问题,可以去微软的官网查看。

在U3D中要访问Access数据库,我们需要用到两个dll,System.Data.dll和System.EnterpriseServices.dll,缺一不可。我们找到这两个dll放到u3d的Plugins文件夹下面。

下面我们创建一个Access数据库版本是07样式是*.accdb(03版本的Access数据库的样式为*.mdb)在我们进行code的时候,要根据不同的版本进行判断啦,对于不同的Access数据库版本,我们要对应不懂的文件后缀名。要不然会提示你数据库文件是未知文件。
下面是读取Access的一个demo,其他的修改,添加数据都是在修改他的sql语句啦,相关的知识,可以查看Access在.net中如何对Access进行CURD操作的。简单的代码如下:
复制代码
  1. /* |-------------------------------------------
  2. * |作者:Mr.野猪
  3. * |
  4. * |时间:2012/09/26  晚:23:56
  5. * |
  6. * |目的:用于技术交流
  7. * |------------------------------------------
  8. */
  9. using UnityEngine;
  10. using System.Collections;
  11. //引入命名空间
  12. using System;
  13. using System.Data;
  14. using System.Data.Odbc;
  15. public class RaderData : MonoBehaviour
  16. {
  17.     /// <summary>
  18.     /// 声明一个接受读取数据字段值的变量
  19.     /// </summary>
  20.     string text = string.Empty;
  21.     public void Start()
  22.     {
  23.         //读取数据文件。
  24.         ReadStudent(Application.dataPath + "/Wild boar.accdb");
  25.     }
  26.     /// <summary>
  27.     /// 读取表数值的函数
  28.     /// </summary>
  29.     /// <param name="filetoread">数据文件的路径</param>
  30.     internal void ReadStudent(string filetoread)
  31.     {
  32.         //声明连接数据库的字段
  33.         string connection = "Driver={Microsoft Access Driver (*.mdb, *.accdb)}; DBQ=" + filetoread;
  34.     
  35.         //从表中查询所有数据
  36.         string sqlQuery = "select * from Student";
  37.         //打开数据库
  38.         OdbcConnection con = new OdbcConnection(connection);
  39.         //对数据库进行操作
  40.         OdbcCommand cmd = new OdbcCommand(sqlQuery,con);
  41.         //根据表名,读取数据到一个临时表
  42.         DataTable dt = new DataTable("Student");
  43.         //try catch finally进行了异常处理,这个是好习惯,嘿嘿
  44.         try
  45.         {
  46.             //打开数据库
  47.             con.Open();
  48.             //读取数据
  49.             OdbcDataReader reader = cmd.ExecuteReader();
  50.             //把数据加载到临时表
  51.             dt.Load(reader);
  52.             //在使用完毕之后,一定要关闭,要不然会出问题
  53.             reader.Close();
  54.             //关闭数据库
  55.             con.Close();
  56.         }
  57.         catch (Exception ex)
  58.         {
  59.             Debug.Log(ex.ToString());
  60.         }
  61.         finally
  62.         {
  63.             //判断数据库是否打开,如果打开就关闭。
  64.             if (con.State!=ConnectionState.Closed)
  65.             {
  66.                 con.Close();
  67.             }
  68.             
  69.             //释放数据库资源
  70.             con.Dispose();
  71.         }
  72.         if (dt.Rows.Count>0)
  73.         {
  74.             //读取数据
  75.             for (int i = 0; i < dt.Rows.Count; i++)
  76.             {
  77.                 text = dt.Columns[0].ColumnName + " : " + dt.Rows[dt.Columns[0].ColumnName].ToString() + "  |  " + dt.Columns[1].ColumnName + " : " + dt.Rows[dt.Columns[1].ColumnName].ToString() + "  |  " + dt.Columns[2].ColumnName + " : " + dt.Rows[dt.Columns[2].ColumnName].ToString() + "  |  " + dt.Columns[3].ColumnName + " : " + dt.Rows[dt.Columns[3].ColumnName].ToString();
  78.                 Debug.Log(dt.Columns[0].ColumnName + " : " + dt.Rows[dt.Columns[0].ColumnName].ToString() + "  |  " + dt.Columns[1].ColumnName + " : " + dt.Rows[dt.Columns[1].ColumnName].ToString() + "  |  " + dt.Columns[2].ColumnName + " : " + dt.Rows[dt.Columns[2].ColumnName].ToString() + "  |  " + dt.Columns[3].ColumnName + " : " + dt.Rows[dt.Columns[3].ColumnName].ToString());
  79.             }
  80.         }
  81.     }
  82.     public void OnGUI()
  83.     {
  84.         GUI.Label(new Rect(10,10,500,200),text);
  85.     }
  86. }



下一步,我们生成exe文件.执行完毕之后,我们打开生成的程序截图如下:
为什么会出现这个问题。我在u3d里面看到了他的显示啊,如下:
其实呢,我们在部署的时候,要把数据库文件,copy到生成的文件夹下就可以啦!

再次运行程序,查看效果。如下:
好,看到这里,你应该只到了,我今天重点要说的就是这个问题啦!
下面是我在制作demo时,遇到的问题还有些是我特意测试需要注意的地方:
注意:
1. 一定要记住的是,访问Access数据库时,那两个dll缺一不可,缺少就会出现问题。
2. 在带有dll动态链接库的项目,要在打包时设置他的API兼容层级为.NET 2.0。
3. 使用不同版本的Access数据库要对应不同版本相对应的后缀名。
4. 如果想单独创建一个存放Access数据库的文件夹,你需要在code时,找到这个文件夹,然后打包之后,把你的Access数据库放到与code相对应的位置。要不然,检测不到数据库。
5. 在创建数据库时要认真,嘿嘿,有可能是你的文件名字和后缀名之间多个空格,你的数据也会读不出,在u3d中运行,会提示你未知文件。
6. 就是老生常谈的话题了,sql查询语句一定要记住,拼写正确,标点符号也要对应起来,要不然,出现个小问题,会让你DT好久。曾经在做应用时,也DT过。嘿嘿!
就先总结这几点吧!有什么问题,我们在一块交流进步啦!
最后还想说,在我逃离IT之前,我会努力的前行,为了我可以早点离开!

转载于:https://www.cnblogs.com/xiao-wei-wei/archive/2013/03/23/2976585.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/360873.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uni.reLaunch前出现uni.showToast,不会成功弹出提示信息

解决方案&#xff1a; uni.showToast({title: 发布成功,duration: 1000});setTimeout(function() {uni.reLaunch({url: /pages/tips/index})}, 1000);

LaTeX 基础笔记。开篇

LaTeX 的起源非常牛逼&#xff0c;有一套书大家可能听说过《计算机程序设计艺术》&#xff0c;写了好几本。当然能在计算机方面写上艺术俩字的书恐怕不是我们一般人能读懂得东西了。他的作者在1976年准备写第二卷的时候发现计算机的排版非常难看&#xff0c;所以&#xff0c;为…

Java旧版不断发展

我最近偶然发现了JDK API的一个非常有趣的警告&#xff0c;即Class.getConstructors()方法。 它的方法签名是这样的&#xff1a; Constructor<?>[] getConstructors()有趣的是&#xff0c; Class.getConstructor(Class...)返回一个Constructor<T> &#xff0c;并…

React 学习笔记 —— Ref Hook

用以下三种方式创建 Ref 都可以 import React from reactexport default function Count () {const [count ,setCount] React.useState(0)const myRef React.createRef()const myRef2 React.useRef() // Ref Hook 的方式const myRef3 {current: undefined}const addNumber…

MFC消息机制

MFC消息机制 MFC消息机制涉及许多知识&#xff0c;比如消息分类&#xff0c;消息映射等。知识先了解一下&#xff0c;马上动手实践才是硬道理。我建了个SDI项目&#xff0c;把常用的消息试验了一遍。如果像我一样初学的&#xff0c;可以留下邮箱索取源码。// MainFrm.h afx_msg…

带Lambda表达式的Apache Wicket

这是怎么回事&#xff1f; :) 我一直在从事一些项目&#xff0c;这些项目值得庆幸的是将Apache Wicket用于表示层。 我自然想到Java的8个lambda表达式如何与Wicket完美匹配。 而不仅仅是我&#xff0c; Wicket团队似乎已经在努力更改API&#xff0c;以为开箱即用的lambda提供支…

React 父组件和子组件中的方法相互调用

目录父组件调用子组件方法子组件调用父组件方法父组件调用子组件方法 父组件中调用子组件的getTree方法 父组件 setFormValue()>{this.TreeList.getTree}<TreeList onSelect{this.setFormValue} onRef{(ref) > { this.TreeList ref }} />子组件 componentDidMount…

元素在父元素内垂直居中的思路

1.使用表格 的垂直居中特性 2.div的绝对定位 已知高度的情况下比较好弄. 3.用背景实现.前景元素visibility:hidden; 4.父元素table-cell 5.line-height 图片会跟随文字垂直居中.转载于:https://www.cnblogs.com/fumj/archive/2013/03/27/2984623.html

装饰者模式如何拯救了我的一天

在工作中&#xff0c;我正在处理庞大的Java代码库&#xff0c;该代码库是由许多不同的开发人员在15年的时间里开发的。 并不是所有的事情都由书来完成&#xff0c;但是同时我通常没有机会重构遇到的每一个奇怪之处。 尽管如此&#xff0c;仍可以每天采取提高代码质量的措施。 …

【虚拟主机篇】asp页面实现301重定向方法

301重定向在很多地方都需要用到&#xff0c;也是seo中常见的问题。比如确定首选域或更换网站域名的时候都要用到301重定向。301重定向的方法有好几种&#xff0c;拿ASP类网站来说有&#xff1a;首页301重定向和全站301重定向。 首页301重定向的方法&#xff1a; <% website…

快速的骆驼和云消息传递

Apache Camel是一个流行的&#xff0c;成熟的开源集成库。 它实现了企业集成模式 &#xff0c;这是在集成分布式系统时经常出现的一组模式。 过去&#xff0c;我写过很多关于Camel的文章&#xff0c; 包括为什么我比Spring Integration更喜欢它 &#xff0c; 路由引擎 如何 工作…

antd react dva在model中使用另一个model的state值

const oldData yield select(({ baseDictionary }) > {return ([...customPageSetting.list,]) });

三角形类1

/* 程序的版权和版本声明部分 Copyright (c)2012, 烟台大学计算机学院学生 All rightsreserved. 文件名称&#xff1a; object.cpp 作者&#xff1a;刘清远 完成日期&#xff1a; 2013年3月29日 版本号&#xff1a; v1.0 输入描述&#xff1a;无 问题描述&#xff1a;设计求三…

不可将您的方法命名为“等于”

&#xff08;当然&#xff0c;除非您确实重写了Object.equals() &#xff09;。 我偶然发现了用户Frank的一个非常奇怪的Stack Overflow问题 &#xff1a; 为什么Java的Area&#xff03;equals方法不能覆盖Object&#xff03;equals&#xff1f; 有趣的是&#xff0c;有一个A…

C#GRPC 服务端与客户端通信,故障排除记录

文章目录前言一、问题一解决方法二、问题二解决方法前言 第一次建立GRPC服务端&#xff0c;客服端一直通不到服务端&#xff1b; 问题1&#xff1a; One or more errors occurred. (Status(StatusCodeInternal, Detail"Error starting gRPC call. HttpRequestException:…

青禾BBS数据库查询语句(动网)

数据字典&#xff1a;http://files.cnblogs.com/ahauzyy/dvbbs.rar 查询用户信息: SELECT * FROM dbo.Dv_User WHERE UserName茗迹 查询用户发帖总数: SELECT UserTopic FROM dbo.Dv_User WHERE UserName茗迹 查询用户被删的帖子数&#xff1a; SELECT UserDel FROM dbo.Dv_Us…

EE JSP:Servlet的反向外套

仅当页面数量少或需要精确控制生成的内容&#xff08;二进制PDF等&#xff09;时&#xff0c;才可以从Servlet生成HTML。 对于大多数应用程序&#xff0c;输出将是HTML&#xff0c;我们需要一种更好的方法来完成此操作。 这就是JSP&#xff08;Java服务器页面&#xff09;出现的…

moment 24小时与12小时区别

moment(values.data).format(YYYY-MM-DD HH:mm:ss)--------------24小时 moment(values.data).format(YYYY-MM-DD hh:mm:ss)--------------12小时主要取决于format中的时分秒的大小写

android 自定义xml属性

Android 自定义组件 Android 提供了非常精致的和非常强大的组件化模型&#xff0c;能够更加方便的构建UI,这些UI组件都是基于基本的layout类:View 和 ViewGroup。 部分能够用的widgets包括&#xff1a;Button&#xff0c;TextView,EditText,ListView,CheckBox&#xff0c;Radio…

Neo4j:带密码的TF / IDF(和变体)

几周前&#xff0c;我写了一篇博客文章&#xff0c;介绍了如何使用scikit-learn在HIMYM成绩单上运行TF / IDF&#xff0c;以按情节找到最重要的短语&#xff0c;然后我很好奇在Neo4j中很难做到。 我首先将Wikipedia的TF / IDF示例之一翻译为cypher&#xff0c;以查看该算法的外…