C#基于Linq和反射实现数据持久化框架Xml4DB

        我们知道目前大部分的数据库都是关系型数据库, 所谓关系型数据库,就是指建立在关系模型 基础之上的数据库系统,如Oracle、SQL Server、Access、MySQL等。关系模型就是指二维表格模型,因而一个关系型数据库就是由二维表及其之间的联系组成的一个数据组织。一个偶然的机会我接触到了DB4O,它是一个完全面向对象的开源数据库,它的出现完全颠覆了传统的数据库在人们心中的形象,因为传统的数据库需要在数据体、实体之间转换,而且需要映射文件提供映射关系。正是这个项目让我产生了编写Xml4DB的想法,从这个名字我们可以看粗,它是基于Xml的形式来实现存储的。我们知道,将一个对象以一定的形式存储称为序列化、反之则成为反序列化,因此反射是整个项目中最为有趣和强大的基础。由于数据库需要查询,所以Linq成为了我设计这个项目的首选,Xml4DB在使用上力求简单,参考了DB4O的优雅的方法。

       下载Xml4DB

       接下来呢,我们就来演示下如何使用Xml4DB吧。在Xml4DB中只有两个重要的类:XmlDB和XmlDBFactory,我们只需要使用XmlDBFactory就可以实现对XmlDB的创建。XmlDBFactory是一个静态工厂类,提供了三个方法:

       1、CreatXmlDB()方法以覆盖式的方式创建数据库。当数据库文件不存在时,则创建数据库,如果数据库存在,则对数据库进行覆盖操作。此方法适合第一次创建数据库时使用。

       2、LoadXmlDB()方法用于获取一个已经存在的数据库,如果数据库文件不存在将引发异常。

       3、UpdateXmlDB()以升级方式创建XmlDB数据库,前提是数据库文件已经存在,且新创建的数据库的版本要比之前的版本高。

       介绍完工厂类,我们来讲解数据库类XmlDB,在此类中我们定义了常见的数据库方法:

       1、Insert()方法用于向数据库中插入一个对象

       2、Read()方法用于从数据库读取一个或多个对象,返回List<T>

      3、Delete()方法用于从数据库中删除一个或多个对象

      4、Update()方法用于将一个或多个对象的值修改为对应的相同类型的值

      下面我们给出一个示例程序代码:

      

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
using Xml4DB;

namespace Xml4DB.Sample
{
    class Program
    {
        static void Main(string[] args)
        {
            //以覆盖方式创建XmlDB
            XmlDB mDB = XmlDBFactory.CreatXmlDB("XmlDB示例程序","D:\\XmlDB演示程序\\Sample.xml",1);
            //创建Student对象李逍遥
            Student mStudent = new Student(1, "李逍遥", 18);
            //插入Student对象李逍遥
            mDB.Insert(mStudent);
            //创建Student对象酒剑仙
            mStudent = new Student(2, "酒剑仙", 37);
            //插入Student对象酒剑仙
            mDB.Insert(mStudent);
            //创建Student对象赵灵儿
            mStudent = new Student(3, "赵灵儿", 17);
            //插入Student对象赵灵儿
            mDB.Insert(mStudent);
            //创建Student对象慕容紫英
            mStudent = new Student(4, "慕容紫英", 20);
            //插入Student对象慕容紫英
            mDB.Insert(mStudent);
            //提交修改
            mDB.Commit();

            //查询姓名为李逍遥的Student对象
            List<Student> objects = mDB.Read(new Student(0, "李逍遥", 0));
            //输出查询结果
            Console.WriteLine(objects[0].ToString());

            //将姓名为酒剑仙的对象中的姓名改为司徒钟,年龄改为40
            mDB.Update(new Student(0, "酒剑仙", 0), new Student(0, "司徒钟", 40));
            //删除ID为3的对象记录
            mDB.Delete(new Student(3, null, 0));
            mDB.Commit();

            //读取全部的Student记录
            objects = mDB.Read(new Student());
            foreach (Student obj in objects)
            {
                Console.WriteLine(obj.ToString());
            }

            //等待以便观察结果
            Console.ReadKey();
        }

        /// <summary>
        /// XmlDB演示类
        /// </summary>
        public class Student
        {
            public Student()
            {

            }

            public Student(int mID,string mName,int mAge)
            {
                this.mID = mID;
                this.mName = mName;
                this.mAge=mAge;
            }

            private int mAge;
            public int Age
            {
                get { return mAge; }
                set { mAge = value; }
            }

            private int mID;
            public int ID
            {
                get { return mID; }
                set { mID = value; }
            }

            private string mName;
            public string Name
            {
                get { return mName; }
                set { mName = value; }
            }

            public override string ToString()
            {
                return string.Format("ID={0},Name={1},Age={2}", this.ID, this.Name,this.Age);
            }
        }
    }
}
 

       怎么样?是不是感觉很简单呢?这个项目采用了Xml作为数据存储的格式,所以最终的数据库文件就是一个Xml文件(这和序列化、反序列化类似),就像下面这样:

<?xml version="1.0" encoding="utf-8"?>
<XmlDB DBName="XmlDB示例程序" DBVersion="1">
  <Student>
    <Age>18</Age>
    <ID>1</ID>
    <Name>李逍遥</Name>
  </Student>
  <Student>
    <Age>37</Age>
    <ID>2</ID>
    <Name>酒剑仙</Name>
  </Student>
  <Student>
    <Age>17</Age>
    <ID>3</ID>
    <Name>赵灵儿</Name>
  </Student>
  <Student>
    <Age>20</Age>
    <ID>4</ID>
    <Name>慕容紫英</Name>
  </Student>
</XmlDB>

       由于假期时间有限,所以目前这个项目只提供了对整型和字符型的基础类型的支持,后面将增加对它基本类型的支持;由于目前部分算法并不完善,所以目前这个项目不支持嵌套的类型属性,等后面有时间的话会逐步完善这个项目的。需要注意的是,在这个项目中整型的默认值为0,字符型的默认值为null,所以请不要给对象赋予这样的属性值,因为这样的对象将被排除,从而造成无法读取对象的问题。每一个对象实体都要默认给出一个不带参数的构造函数,因为内部构造中使用了反射技术,当根据一个类型来生成一个新实例时就会用到。希望大家会喜欢,谢谢!


       


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
你可以使用 C# 中的 `OpenXML` 库来实现 XML 和 Excel 文件之间的相互转换。下面是一个简单的示例代码,演示了如何将 XML 数据导出到 Excel 文件,并将 Excel 文件导入为 XML 数据。 首先,你需要添加对 `DocumentFormat.OpenXml` 和 `WindowsBase` 的引用。然后,你可以尝试以下代码: ```csharp using DocumentFormat.OpenXml; using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Spreadsheet; using System; using System.IO; using System.Linq; using System.Xml.Linq; public static class XmlExcelConverter { public static void ExportXmlToExcel(string xmlFilePath, string excelFilePath) { XDocument xmlDocument = XDocument.Load(xmlFilePath); using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Create(excelFilePath, SpreadsheetDocumentType.Workbook)) { WorkbookPart workbookPart = spreadsheetDocument.AddWorkbookPart(); workbookPart.Workbook = new Workbook(); WorksheetPart worksheetPart = workbookPart.AddNewPart<WorksheetPart>(); worksheetPart.Worksheet = new Worksheet(new SheetData()); Sheets sheets = spreadsheetDocument.WorkbookPart.Workbook.AppendChild(new Sheets()); Sheet sheet = new Sheet() { Id = spreadsheetDocument.WorkbookPart.GetIdOfPart(worksheetPart), SheetId = 1, Name = "Sheet1" }; sheets.Append(sheet); var data = xmlDocument.Descendants("data").ToList(); for (int i = 0; i < data.Count; i++) { var rowData = data[i].Descendants("row").ToList(); for (int j = 0; j < rowData.Count; j++) { var cellData = rowData[j].Descendants("cell").ToList(); for (int k = 0; k < cellData.Count; k++) { var cell = new Cell() { DataType = CellValues.String, CellValue = new CellValue(cellData[k].Value) }; worksheetPart.Worksheet.GetFirstChild<SheetData>().AppendChild(new Row(new Cell[] { cell })); } } } workbookPart.Workbook.Save(); } } public static void ImportExcelToXml(string excelFilePath, string xmlFilePath) { XDocument xmlDocument = new XDocument(); using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(excelFilePath, false)) { WorkbookPart workbookPart = spreadsheetDocument.WorkbookPart; WorksheetPart worksheetPart = workbookPart.WorksheetParts.First(); var rows = worksheetPart.Worksheet.GetFirstChild<SheetData>().Elements<Row>(); XElement rootElement = new XElement("root"); foreach (var row in rows) { XElement rowData = new XElement("row"); foreach (var cell in row.Elements<Cell>()) { var cellValue = GetCellValue(cell, workbookPart); XElement cellData = new XElement("cell", cellValue); rowData.Add(cellData); } rootElement.Add(rowData); } xmlDocument.Add(rootElement); } xmlDocument.Save(xmlFilePath); } private static string GetCellValue(Cell cell, WorkbookPart workbookPart) { if (cell.DataType == null) { return cell.CellValue.InnerText; } string value = cell.CellValue.InnerText; if (cell.DataType.Value == CellValues.SharedString) { var sharedStringTablePart = workbookPart.GetPartsOfType<SharedStringTablePart>().FirstOrDefault(); if (sharedStringTablePart != null) { return sharedStringTablePart.SharedStringTable.ChildElements[int.Parse(value)].InnerText; } } return value; } } ``` 使用此代码,你可以将指定的 XML 文件导出到 Excel 文件中,或将 Excel 文件导入为 XML 文件。例如: ```csharp string xmlFilePath = "path/to/xml/file.xml"; string excelFilePath = "path/to/excel/file.xlsx"; // 将 XML 导出为 Excel XmlExcelConverter.ExportXmlToExcel(xmlFilePath, excelFilePath); // 将 Excel 导入为 XML XmlExcelConverter.ImportExcelToXml(excelFilePath, xmlFilePath); ``` 请确保指定的 XML 文件和 Excel 文件存在,并根据实际情况修改文件路径。希望这可以帮助到你!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云来雁去

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值