利用Unity进行DataTable的学习

前言:在我学习 C# 反射的时候(张子阳老师的《.Net之美》一书中),书中举例用到了DataTable,所以对DataTable进行了简单的学习。

   (感谢张子阳老师的著作《.Net之美》一书,感谢hcw_peter老师分享的关于DataTable文章)

1.什么是DataTable?

 答:是一个临时保存数据的网格虚拟表(表示内存中数据的一个表。)。DataTable是ADO dot net 库中的核心对象。它可以被应用在 VB 和 ASP 上。它无须代码就可以简单的绑定数据库。它具有微软风格的用户界面。----摘自《百度百科》

2.使用DataTable的好处是什么?

 答:在项目中经常用到DataTable,如果DataTable使用得当,不仅能使程序简洁实用,而且能够提高性能,达到事半功倍的效果。

3.初识:

  (1)构造函数 

                          DataTable()   不带参数初始化DataTable 类的新实例。 
                          DataTable(string tableName)  用指定的表名初始化DataTable 类的新实例。 
                          DataTable(string tableName, string tableNamespace) 用指定的表名和命名空间初始化DataTable 类的新实例。 


                 
(2) 常用属性 
                         
 CaseSensitive    指示表中的字符串比较是否区分大小写。 
                          ChildRelations   获取此DataTable 的子关系的集合。 
                          Columns             获取属于该表的列的集合。 
                          Constraints        获取由该表维护的约束的集合。 
                          DataSet               获取此表所属的DataSet。 
                          DefaultView       获取可能包括筛选视图或游标位置的表的自定义视图。 
                          HasErrors          获取一个值,该值指示该表所属的DataSet 的任何表的任何行中是否有错误。 
                          MinimumCapacity  获取或设置该表最初的起始大小。该表中行的最初起始大小。默认值为 50。 
                          Rows                  获取属于该表的行的集合。 
                          TableName       获取或设置DataTable 的名称。 

 

                 (3)常用方法 
                          AcceptChanges()   提交自上次调用AcceptChanges() 以来对该表进行的所有更改。 
                          BeginInit()         开始初始化在窗体上使用或由另一个组件使用的DataTable。初始化发生在运行时。

 

                          Clear()               清除所有数据的DataTable。 
                          Clone()              克隆DataTable 的结构,包括所有DataTable 架构和约束。 
                          EndInit()            结束在窗体上使用或由另一个组件使用的DataTable 的初始化。初始化发生在运行时。 
                          ImportRow(DataRow row)    将DataRow 复制到DataTable 中,保留任何属性设置以及初始值和当前值。 
                          Merge(DataTable table)  将指定的DataTable 与当前的DataTable 合并。 
                          NewRow()         创建与该表具有相同架构的新DataRow。

4.使用:因为职业的原因,我常用Unity引擎,所以:

using UnityEngine;
using System.Collections;
using System.Data;
using System.Data.SqlClient;
using System;
using System.IO;
using System.Xml;
using UnityEngine.UI;

public class SoftwareRun : MonoBehaviour
{
    public DataTable dt;
    public DataTable dtCopy;
    // Use this for initialization
    void Start ()
    {
        //1.创建一个DataTable
        CreateADataTable();

        //2.为表添加列
        AddColumsForDataTable();

        //3.为表添加行
        AddRowsForDataTable();

        //4.选择行
        SelectRow();

        //5.复制DataTable
        CopyDataTableOnlyScheme();

        //6.操作一行
        OperateOneRow();

        //7.转换为字符串
        ConvertToString();

        //11.判断已字符串是否为DataTable的列名
        JudgeTheDataTableIsColumnNameIsAString();

        //12.数据表转换为XML和XML转换为DataTable
        Page_Load();


    }

    //1.创建一个DataTable
    public void CreateADataTable()
    {
        dt = new DataTable("MyFirstDataTable");
    }

    //2.为表添加列
    public void AddColumsForDataTable()
    {
        dt.Columns.Add("column0", Type.GetType("System.String"));
        dt.Columns.Add("column1", Type.GetType("System.String"));
        dt.Columns.Add("column2", Type.GetType("System.String"));

        DataColumn dc = new DataColumn("column3", Type.GetType("System.Boolean"));
        dt.Columns.Add(dc);

    }

    //3.为表添加行
    public void AddRowsForDataTable()
    {
        DataRow dr = dt.NewRow();
        dr["column0"] = "Xxx";
        dr["column1"] = "Jjj";
        dr["column2"] = "Fff";
        dr["column3"] = true;
        dt.Rows.Add(dr);

        DataRow dr1 = dt.NewRow();
        dt.Rows.Add(dr1);
    }

    //4.选择行
    public void SelectRow()
    {
        DataRow[] drs = dt.Select("column3 is null");
        DataRow[] drs1 = dt.Select("column0 = 'Xxx'");
    }

    //5.复制DataTable
    public void CopyDataTableOnlyScheme()
    {
        dtCopy = dt.Clone();
    }

    //6.操作一行
    public void OperateOneRow()
    {
        //对dt的操作
        //Method 1 (方法)
        DataRow drOperate = dt.Rows[0];
        drOperate["column0"] = "DeanXxx";
        drOperate["column1"] = "DeanJjj";
        drOperate["column2"] = "DeanFff";

        //方法二
        drOperate[0] = "DeanXxx";
        drOperate[1] = "DeanJjj";
        drOperate[2] = "DeanFff";

        //方法三
        dt.Rows[0]["column0"] = "DeanXxx";
        dt.Rows[0]["column1"] = "DeanJjj";
        dt.Rows[0]["column2"] = "DeanFff";

        //方法四
        dt.Rows[0][0] = "DeanXxx";
        dt.Rows[0][1] = "DeanJjj";
        dt.Rows[0][2] = "DeanFff";
        dt.Rows[0][3] = "false";

    }

    //7.转换为字符串
    public void ConvertToString()
    {
        StringWriter sw = new StringWriter();
        XmlTextWriter xw = new XmlTextWriter(sw);

        dt.WriteXml(xw);

        string str = sw.ToString();

        Text text = GameObject.Find("Canvas/Text").GetComponent<Text>();
        text.text = str;
    }

    //8.过滤表
    public void FilterDataTable()
    {
        dt.DefaultView.RowFilter = "column4 <> true";
        dt.DefaultView.RowFilter = "column4 = true";
    }

    //11.判断已字符串是否为DataTable的列名
    public void JudgeTheDataTableIsColumnNameIsAString()
    {
        bool b1 = dt.Columns.Contains("XXX");
        Debug.Log(b1);

        bool b2 = dt.Columns.Contains("column0");
        Debug.Log(b2);
    }

    //12.数据表转换为XML和XML转换为DataTable
    private void Page_Load()
    {

        string xml = ConvertBetweenDataTableAndXML_AX(dt);

        DataTable ddt = ConvertBetweenDataTableAndXML_AX(xml);

        Text xmlText = GameObject.Find("xml").GetComponent<Text>();
        Text dataText = GameObject.Find("data").GetComponent<Text>();

        xmlText.text = xml;

        StringWriter sw = new StringWriter();

        XmlTextWriter xw = new XmlTextWriter(sw);

        ddt.WriteXml(xw);

        string sxw = sw.ToString();

        dataText.text = sxw;



    }

    //DataTable转Xml
    public string ConvertBetweenDataTableAndXML_AX(DataTable dtNeedConvert)
    {
        TextWriter tw = new StringWriter();

        dtNeedConvert.TableName = dtNeedConvert.TableName.Length == 0 ? "Table_AX" : dtNeedConvert.TableName;

        dtNeedConvert.WriteXml(tw);
        dtNeedConvert.WriteXmlSchema(tw);

        return tw.ToString();
    }

    //xml转DataTable
    public DataTable ConvertBetweenDataTableAndXML_AX(string xml)
    {
        TextReader trDataTable = new StringReader(xml.Substring(0, xml.IndexOf("<?xml")));
        TextReader trSchema = new StringReader(xml.Substring(xml.IndexOf("<?xml")));
        DataTable dtReturn = new DataTable();
        dtReturn.ReadXmlSchema(trSchema);
        dtReturn.ReadXml(trDataTable);

        return dtReturn;
    }

    void Update ()
    {
    
    }
}

 

注:在Unity中使用DataTable,需要手动在Asset/Plugins文件夹下添加以下两个dll库。

    1.Mono.Data.Sqlite.dll

    2.System.Data.dll (注意不能是Unity自带的)

 

   

Dean二十七
原文地址:https://www.cnblogs.com/Dean27/p/6005552.html