首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

DataTable 與 String 相互轉換:可逆序列化實作

     編輯:關於.NET

專案需求常遇到將 DataTable 序列化為字串 (存儲、傳輸) 再還原的情境。本文提供一組可逆轉換方法,採用 XML Schema 保留結構,自訂分隔符區隔資料列與欄位,確保往返無損。

DataTable → String

核心邏輯:

  1. 以 DataTable.WriteXmlSchema 寫入 StringWriter 取得結構定義 XML。
  2. 附加特殊分隔符 @&@ 標記結構結束。
  3. 逐列逐欄迭代,欄位間以 ^&* 分隔,列間以 #$% 分隔 (首列不加列分隔符)。
  4. 欄位值以 Convert.ToString 處理 DBNull。
public static string DataTableToString(DataTable dt) {
    StringBuilder strData = new StringBuilder();
    using (StringWriter sw = new StringWriter()) {
        dt.WriteXmlSchema(sw);
        strData.Append(sw.ToString());
    }
    strData.Append("@&@");
    for (int i = 0; i < dt.Rows.Count; i++) {
        DataRow row = dt.Rows[i];
        if (i > 0) strData.Append("#$%");
        for (int j = 0; j < dt.Columns.Count; j++) {
            if (j > 0) strData.Append("^&*");
            strData.Append(Convert.ToString(row[j]));
        }
    }
    return strData.ToString();
}

String → DataTable

還原步驟:

  1. 以 @&@ 分割結構 XML 與資料區。
  2. 用 StringReader 讀回 XML Schema 重建 DataTable 結構 (含欄位型別、約束)。
  3. 以 #$% 分割列,再以 ^&* 分割欄位,呼叫 DataTable.Rows.Add(object[]) 逐列填入。
public static DataTable StringToDataTable(string strdata) {
    if (string.IsNullOrEmpty(strdata)) return null;
    DataTable dt = new DataTable();
    string[] parts = strdata.Split(new[] { "@&@" }, StringSplitOptions.None);
    using (StringReader sr = new StringReader(parts[0])) {
        dt.ReadXmlSchema(sr);
    }
    if (parts.Length > 1 && !string.IsNullOrEmpty(parts[1])) {
        string[] rows = parts[1].Split(new[] { "#$%" }, StringSplitOptions.None);
        foreach (string rowStr in rows) {
            string[] cols = rowStr.Split(new[] { "^&*" }, StringSplitOptions.None);
            dt.Rows.Add(cols);
        }
    }
    return dt;
}

設計考量

  • 分隔符選用極低機率出現於資料中的特殊字元組合,降低衝突風險。
  • XML Schema 完整保留欄位資料型別、自動遞增、唯一鍵等中繼資料。
  • 適合中小型資料量;大量資料建議改用二進位序列化或壓縮。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved