浅谈Unity之读取Excel表格保存到Sqlite数据库

本文涉及的产品
模型训练 PAI-DLC,100CU*H 3个月
交互式建模 PAI-DSW,每月250计算时 3个月
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
简介: 读取Excel表格保存到Sqlite数据库

1.读取Excel表格和保存sqlite数据库所用到的dll文件  

最后如下图所示


废话不多说了,直接上代码吧


using System.Collections;

using System.Collections.Generic;

using UnityEngine;

using Mono.Data.Sqlite;

using System;

using System.IO;

using System.Data;

using Excel;

public class SQLiteDataBase

{

   private SqliteConnection conn; // SQLite连接

   private SqliteDataReader reader;

   private SqliteCommand command;// SQLite命令

   private float timespeed = 0.001f;

   /// <summary>

   /// 执行SQL语句  公共方法

   /// </summary>

   /// <param name="sqlQuery"></param>

   /// <returns></returns>

   public SqliteDataReader ExecuteQuery(string sqlQuery)

   {

       command = conn.CreateCommand();

       command.CommandText = sqlQuery;

       reader = command.ExecuteReader();

       return reader;

   }

   #region 打开/关闭数据库

   /// <summary>

   /// 打开数据库

   /// </summary>

   /// <param name="connectionString">@"Data Source = " + path</param>

   public SQLiteDataBase(string connectionString)

   {

       try

       {

           //构造数据库连接

           conn = new SqliteConnection(connectionString);

           //打开数据库

           conn.Open();

           Debug.Log("打开数据库");

       }

       catch (Exception e)

       {

           Debug.Log(e.Message);

       }

   }

   /// <summary>

   /// 关闭数据库连接

   /// </summary>

   public void CloseSqlConnection()

   {

       if (command != null) { command.Dispose(); command = null; }

       if (reader != null) { reader.Dispose(); reader = null; }

       if (conn != null) { conn.Close(); conn = null; }

       Debug.Log("关闭数据库!");

   }

   #endregion;

   #region 创建表单

   /// <summary>

   /// 创建表单  第一种

   /// </summary>

   /// <param name="name">表单名</param>

   /// <param name="col">字段</param>

   /// <param name="colType">类型</param>

   public void CreationMenu(string name, string[] col, string[] colType)

   {

       string query = "create table " + name + " (" + col[0] + " " + colType[0];

       for (int i = 1; i < col.Length; ++i)

       {

           query += ", " + col[i] + " " + colType[i];

       }

       query += ")";        

       command = new SqliteCommand(query, conn);

       command.ExecuteNonQuery();

   }

   /// <summary>  第二种  区别第一种用了公共方法  原理应该是一样的  经测试都可以使用

   /// 创建表  param name=表名 col=字段名 colType=字段类型

   /// </summary>

   public SqliteDataReader CreateTable(string name, string[] col, string[] colType)

   {

       if (col.Length != colType.Length)

       {

           throw new SqliteException("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);

   }

   #endregion;

   #region 查询数据

   /// <summary>

   /// 查询表中全部数据 param tableName=表名  

   /// </summary>

   public SqliteDataReader ReadFullTable(string tableName)

   {

       string query = "SELECT * FROM " + tableName;

       return ExecuteQuery(query);

   }

   /// <summary>

   /// 按条件查询数据 param tableName=表名 items=查询字段 col=查找字段 operation=运算符 values=内容

   /// </summary>

   public SqliteDataReader SelectWhere(string tableName, string[] items, string[] col, string[] operation, string[] values)

   {

       if (col.Length != operation.Length || operation.Length != values.Length)

       {

           throw new SqliteException("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[i] + "' ";

       }

       return ExecuteQuery(query);

   }

   /// <summary>

   /// 查询表

   /// </summary>

   public SqliteDataReader Select(string tableName, string col, string values)

   {

       string query = "SELECT * FROM " + tableName + " WHERE " + col + " = " + values;

       return ExecuteQuery(query);

   }

   public SqliteDataReader Select(string tableName, string col, string operation, string values)

   {

       string query = "SELECT * FROM " + tableName + " WHERE " + col + operation + values;

       return ExecuteQuery(query);

   }

   /// <summary>

   /// 升序查询

   /// </summary>

   public SqliteDataReader SelectOrderASC(string tableName, string col)

   {

       string query = "SELECT * FROM " + tableName + " ORDER BY " + col + " ASC";

       return ExecuteQuery(query);

   }

   /// <summary>

   /// 降序查询

   /// </summary>

   public SqliteDataReader SelectOrderDESC(string tableName, string col)

   {

       string query = "SELECT * FROM " + tableName + " ORDER BY " + col + " DESC";

       return ExecuteQuery(query);

   }

   /// <summary>

   /// 查询表行数

   /// </summary>

   public SqliteDataReader SelectCount(string tableName)

   {

       string query = "SELECT COUNT(*) FROM " + tableName;

       return ExecuteQuery(query);

   }

   #endregion

   #region 插入数据

   /// <summary>

   /// 插入数据 param tableName=表名 values=插入数据内容

   /// 插入一条数据

   /// </summary>

   public SqliteDataReader 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 += "')";

       return ExecuteQuery(query);

   }

   /// <summary>

   /// 插入数据     插入多条数据

   /// </summary>    经测试这个方法是可用的

   /// 因为我的数据有两万条运行卡着不动了,所以用协程时间控制一下 虽然慢但是不卡死,写到数据库中之后用数据库就好了

   /// <param name="tableName">表名字</param>

   /// <param name="values">字典</param>

   /// <returns></returns>

   public IEnumerator InsertInto(string tableName, Dictionary<string, List<string>> values)

   {

       int ii = 0;

       foreach (var item in values)

       {

           string query = "";

           string value = "";

           foreach (var ite in item.Value)

           {

               value += "','" + ite;

           }

           query = "INSERT INTO " + tableName + " VALUES ('" + item.Key + value + "')";

           //Debug.Log(query);

           command = conn.CreateCommand();

           command.CommandText = query;

           command.ExecuteNonQuery();

           Debug.Log("写入成功" + ii++);

           yield return new WaitForSeconds(timespeed);

       }

       Debug.Log("写入成功");

   }

 

   #region 没测试过的

   /// <summary>

   /// 插入数据 param tableName=表名 cols=插入字段 value=插入内容

   /// </summary>

   public SqliteDataReader InsertIntoSpecific(string tableName, string[] cols, string[] values)

   {

       if (cols.Length != values.Length)

       {

           throw new SqliteException("columns.Length != values.Length");

       }

       string query = "INSERT INTO " + tableName + "('" + cols[0];

       for (int i = 1; i < cols.Length; ++i)

       {

           query += "', '" + cols[i];

       }

       query += "') VALUES ('" + values[0];

       for (int i = 1; i < values.Length; ++i)

       {

           query += "', '" + values[i];

       }

       query += "')";

       return ExecuteQuery(query);

   }

   /// <summary>

   /// 更新数据 param tableName=表名 cols=更新字段 colsvalues=更新内容 selectkey=查找字段(主键) selectvalue=查找内容

   /// </summary>

   public SqliteDataReader 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);

   }

   #endregion

   #endregion

   #region 删除

   /// <summary>

   /// 删除表   IF EXISTS判断表存不存在防止出错  已测试

   /// </summary>

   public SqliteDataReader DeleteContents(string tableName)

   {

       string query = "DROP TABLE IF EXISTS " + tableName;

       Debug.Log("删除表成功");

       return ExecuteQuery(query);

   }

   /// <summary>

   /// 删除数据 param tableName=表名 cols=字段 colsvalues=内容  

   /// </summary>

   public SqliteDataReader 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];

       }

       return ExecuteQuery(query);

   }

   #endregion

}

public class SQLiteDataBaseTion : MonoBehaviour

{

   [Header("Excel表数据长度")]   //表格一共有多少列数 最长的一个

   public int tableint;

   public string[] fields, type;   //字段\类型

   [Header("数据库名字")]

   public string dbname;

   private SQLiteDataBase _SQLiteData;

   private SqliteDataReader reader;

   private string path;

   private  string connectionString;

   public static Dictionary<string, List<string>> JDDateDic = new Dictionary<string, List<string>>();//机电数据

   public static Dictionary<string, List<string>> OneCDateDic = new Dictionary<string, List<string>>();//一层数据

   private void Awake()

   {

       fields = new string[tableint];

       type = new string[tableint];

       for (int i = 0; i < tableint; i++)

       {

           fields[i] = "sql" + i.ToString();

           type[i] = "varchar";

       }

   }

   // Start is called before the first frame update

   void Start()

   {

       //读取excel表格数据

       ReadExcelClick("jiegou.xlsx", 0, OneCDateDic);

       path = Application.streamingAssetsPath + "/"+ dbname + ".db";

       connectionString = @"Data Source = " + path;

       //创建数据库文件  存在就打开

       CreateSQL(dbname);        

       //创建表

       //_SQLiteData.CreationMenu("jiegou", fields, type);

       //将数据插入数据库

       //StartCoroutine(_SQLiteData.InsertInto("jiegou", OneCDateDic));

       //删除表  

       //_SQLiteData.DeleteContents("jiegou");

   }

   /// <summary>

   ///   创建数据库文件

   /// </summary>

   /// <param name="sqlname">文件名字</param>

   public void CreateSQL(string sqlname)

   {

       if (!File.Exists(Application.streamingAssetsPath + "/" + sqlname + ".db"))

       {

           //不存在就创建

           File.Create(Application.streamingAssetsPath + "/" + sqlname + ".db");

           //创建之后再打开

           _SQLiteData = new SQLiteDataBase(connectionString);

       }

       else

       {

           Debug.Log("已存在");

           //打开数据库

           _SQLiteData = new SQLiteDataBase(connectionString);

       }

   }

   /// 读取数据库某一行数据    "646c173c-7d14-47b0-80fe-53c1c8ce2b0e-0037044a"

   public List<string> SomeLine(string idname,out List <string >listidnames)

   {

       reader = _SQLiteData.ReadFullTable("jidian");

       List<string> idname_ = new List<string>();

       while (reader.Read())

       {

           //Debug.Log(reader.GetString(reader.GetOrdinal("idname")));//  reader.ToString();

           if (reader.GetString(0).ToString() == idname)

           {

               for (int i = 0; i < reader.FieldCount; i++)

               {

                   try

                   {

                       if (reader.GetString(i) != null)

                       {

                           Debug.Log(reader.GetString(i));

                           idname_.Add(reader.GetString(i));

                       }

                   }

                   catch (Exception e)

                   {

                       Debug.Log(e.Message);

                       break;

                   }

               }

               listidnames = idname_;

               return listidnames;

           }          

       }

       listidnames = idname_;

       return listidnames;

   }

   //读取 Excel表格

   void ReadExcelClick(string _name, int _num, Dictionary<string, List<string>> _Dic)

   {

       //1.打开文件,创建一个文件流操作对象

       //FileStream fileStream = new FileStream(Application.streamingAssetsPath + "/" + "机电.xlsx", FileMode.Open, FileAccess.Read);

       FileStream fileStream = new FileStream(Application.streamingAssetsPath + "/" + _name, FileMode.Open, FileAccess.Read);

       //2.创建一个excel读取类

       IExcelDataReader reader = ExcelReaderFactory.CreateOpenXmlReader(fileStream);

       //方法1:读取

       //while (reader.Read())

       //{

       //    string name = reader.GetString(0);

       //    string birth = reader.GetString(1);

       //    string brief = reader.GetString(2);

       //    Debug.Log("姓名:" + name + " --- " + "生卒:" + birth + " --- " + "简介:" + brief);

       //}

       //方法2:读取

       DataSet result = reader.AsDataSet();

       //获取行数

       int rows = result.Tables[_num].Rows.Count;

       Debug.Log(rows);

       //获取列数

       int column = result.Tables[_num].Columns.Count;

       for (int i = 0; i < rows; i++)

       {

           //获取i行的第一列数据

           string name = result.Tables[_num].Rows[i][0].ToString();

           List<string> _S = new List<string>();

           for (int j = 1; j < column; j++)

           {

               string birth = result.Tables[_num].Rows[i][j].ToString();

               _S.Add(birth);

           }

           if (_Dic.ContainsKey(name))

           {

               continue;

           }

           _Dic.Add(name, _S);

       }

       Debug.Log(_Dic.Count);

   }

   private void OnDisable()

   {

       _SQLiteData.CloseSqlConnection();

   }

   // Update is called once per frame

   void Update()

   {

     

   }

}


相关文章
|
14天前
|
关系型数据库 MySQL 数据库
Python处理数据库:MySQL与SQLite详解 | python小知识
本文详细介绍了如何使用Python操作MySQL和SQLite数据库,包括安装必要的库、连接数据库、执行增删改查等基本操作,适合初学者快速上手。
92 15
|
1月前
|
存储 SQL 数据库
数据库知识:了解SQLite或其他移动端数据库的使用
【10月更文挑战第22天】本文介绍了SQLite在移动应用开发中的应用,包括其优势、如何在Android中集成SQLite、基本的数据库操作(增删改查)、并发访问和事务处理等。通过示例代码,帮助开发者更好地理解和使用SQLite。此外,还提到了其他移动端数据库的选择。
44 8
|
2月前
|
Web App开发 SQL 数据库
使用 Python 解析火狐浏览器的 SQLite3 数据库
本文介绍如何使用 Python 解析火狐浏览器的 SQLite3 数据库,包括书签、历史记录和下载记录等。通过安装 Python 和 SQLite3,定位火狐数据库文件路径,编写 Python 脚本连接数据库并执行 SQL 查询,最终输出最近访问的网站历史记录。
44 4
|
2月前
|
数据采集 人工智能 自然语言处理
表格增强生成TAG登场:解锁AI自然语言与数据库的完美结合
【10月更文挑战第4天】表格增强生成(TAG)范式解锁了AI自然语言处理与数据库的深度融合,旨在让用户通过自然语言便捷地查询和管理数据。TAG结合了语言模型的强大推理能力和数据库系统的高效计算能力,通过查询合成、执行及答案生成三步完成复杂查询。相较于传统Text2SQL和RAG方法,TAG在准确性上显著提升,但其应用仍面临技术门槛和数据质量等挑战。[论文地址:](https://arxiv.org/pdf/2408.14717)
70 4
|
2月前
|
存储 关系型数据库 数据库
轻量级数据库的利器:Python 及其内置 SQLite 简介
轻量级数据库的利器:Python 及其内置 SQLite 简介
70 3
|
2月前
|
应用服务中间件 PHP Apache
PbootCMS提示错误信息“未检测到您服务器环境的sqlite3数据库扩展...”
PbootCMS提示错误信息“未检测到您服务器环境的sqlite3数据库扩展...”
|
3月前
|
存储 API 数据库
QML使用Sqlite数据库存储ListModel数据
本文介绍了在QML中使用Sqlite数据库存储ListModel数据的方法,包括如何创建数据库、读取数据、动态添加和删除数据,以及如何在程序启动和退出时与数据库同步数据。
|
3月前
|
数据库 数据库管理
qt对sqlite数据库多线程的操作
本文总结了在Qt中进行SQLite数据库多线程操作时应注意的四个关键问题,包括数据库驱动加载、加锁、数据库的打开与关闭,以及QsqlQuery变量的使用。
218 1
|
2月前
|
存储 缓存 关系型数据库
sqlite 数据库 介绍
sqlite 数据库 介绍
52 0
|
3月前
|
JSON NoSQL 数据库
和SQLite数据库对应的NoSQL数据库:TinyDB的详细使用(python3经典编程案例)
该文章详细介绍了TinyDB这一轻量级NoSQL数据库的使用方法,包括如何在Python3环境中安装、创建数据库、插入数据、查询、更新以及删除记录等操作,并提供了多个编程案例。
156 0

热门文章

最新文章