利用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自帶的)

 

   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM