65.9K
CodeProject 正在变化。 阅读更多。
Home

MyHomeLibrary 或我在 C# .NET 中尝试不同的数据管理方法

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.40/5 (4投票s)

2014 年 1 月 18 日

CPOL

5分钟阅读

viewsIcon

18281

downloadIcon

881

.NET 中的数据管理方法

引言

我开始阅读 .NET 是在几个月前。结果发现,有很多不同的方法可以做任何你想做的事情——这真是太棒了。这个程序的想法是尝试不同的数据管理方法——从简单的 txt 文件、XML 文件到不同类型的数据库引擎。这个程序被创建为一个 HomeLibrary 应用程序——存储你的书籍数据——就像这个应用程序的主要流程一样。

背景

在此背景下,我想简单介绍一下这个程序的代码。所以,下面列表中描述的有趣点是:

  • 配置 - *.config 文件 (App.clonfig) - 存储密钥、参数、数据库连接字符串等。
  • 输入/输出 - 允许使用文件——我用它来以 txt 和 XML 格式存储和打开库
  • 接口
  • DLL 库
  • 数据库使用 (连接、断开连接方法, EF) 
  • LINQ  

程序的界面非常简单——只有几个 dataGridViews 用于表示库,以及带有按钮的字段用于控制它。我试图为所有引擎 (txt、XML、数据库使用) 准备相同的 GUI。你可以在下面的图片中看到这个程序

Using the Code

对于这个项目,我将尝试使用接口和 DLL 库等功能。

程序的逻辑在下面的几张图片中进行了描述。首先,你可以看到用于数据库使用的 DLL 类。我试图将数据库使用的代码分离到 DLL 中以供将来使用。在此应用程序中,我使用了连接和断开连接的数据库使用方法,并且还尝试使用 EntityFramework。

在 WinForms 中,我尝试将每种引擎类型隔离到一个单独的类中,并在 mainForm.cs 中使用它。

此外,为此应用程序创建了一个简单的数据库。一个 Book 表和另一个 LibraryStock

如上所述,有几个类用于实现不同的“引擎”类型,例如:

  • Txtengine;
  • XmlEngine;
  • CommonEngine;
  • 包含 3 个类的 DLL - Connected Layer、Disconnected Layer 和 EntityFrameworkLayer。

关注点

让我们来看看每个“引擎”类。

在开始描述类之前,我想简单介绍一下程序的实体——Book LibraryStock。在这个类中,我创建了简单的属性,它们在应用程序中实现了我的想法,给了我很大的帮助。在附件文件中,你可以找到它们为 Book.csLibrayStock.cs

第一个是 TxtEngine ——最简单的数据存储方案——使用 txt.Files。在这个类中,一切都非常简单,但有些东西对我来说很有趣。

关键字 using —— 这是一个非常有用的东西——允许在使用后释放资源。MSDN:通常,当使用 IDisposable 对象时,您应该在 using 语句中声明和实例化它。using 语句以正确的方式调用对象的 Dispose 方法,并且一旦调用了 Dispose ,对象本身就会超出范围。在 using 块内,对象是只读的,不能修改或重新分配。

在我的代码使用中——将库保存到文件

 public void SaveLibrary(string p, List<Book> l)
        {
            using (FileStream fs = new FileStream(p, FileMode.Create, FileAccess.ReadWrite))
            {
                using (StreamWriter sw = new StreamWriter(fs))
                {
                    foreach (Book book in l)
                    {
                        sw.WriteLine(book.BookAuthor + "," +
                            book.BookName + "," +
                            book.BookYear + "," +
                            book.BookGenre + "," +
                            book.BookCategory + "," +
                            book.BookID);
                    }
                    sw.Close();
                }
                fs.Close();
            }
        }   

TXT 中保存数据的结果——有点像下面的图片

第二个引擎——XMLEngine。为了处理 XML,我使用 System.Xml.Linq 中的 XMLDocumentXMLElement。这不是实现这个类的一个方法,而是比前一个更合乎逻辑且最简单的方法。

在创建这个类时,我尝试使用一些 LINQ。例如,在下面的代码中,你可以找到从文件中读取库的方法

public List<Book> OpenLibrary(string f)
        { 
            XDocument myDoc = XDocument.Load(f);
                List<Book> books = myDoc.Root.Elements("Book")
                        .Select(x => new Book
                        {
                            BookAuthor = (string)x.Element("Author"),
                            BookName = (string)x.Element("Name"),
                            BookYear = (int)x.Element("Year"),
                            BookGenre = (string)x.Element("Genre"),
                            BookID = Guid.Parse(x.Element("BookID").Value.Trim().ToString())
                        })
                        .ToList();
                return books;
         }  

关于这些 XML 元素——为了更好地理解它们的使用,只需要创建 2 到 3 个方法——所有内容都会变得非常清晰和合乎逻辑。

以及这个类的运行结果

这两个类实现了 IFileUsage 接口——通过使用文件来存储和控制库(使用 txt 引擎或 XML 引擎)。

IFileUsage:

internal interface IFileUsage
    {
        void SaveLibrary(string p, List<Book> l);
        List<Book> OpenLibrary(string f);
    }  

正如我之前写的,我还创建了一个 CommonEngine 类——包含添加、删除和更新库条目的方法。

程序中的下一个点是数据库的使用。为此,我在 VS 中创建了 DT,如下所示:

正如你所看到的,它非常简单,只有 2 个表,没有存储过程或其他东西。

如前所述,我尝试创建一个 DLL 来将数据库使用代码分离到文件中。LibraryLib.dll - 这个 DLL 包含 3 种不同类型的数据库使用方法——连接的 (ConnectedLayer)、断开连接的 (DisconnectedLayer) 和 EntityFramework(entityFrameWorkLayer)。为了选择引擎类型,我在 GUI 的 DBEngine 选项卡上添加了单选按钮。

关于这 3 个类,我只能说理解如何做到这一点很有趣,但还有很多东西需要阅读和尝试。

在创建这个库时,我尝试了 LINQ to SQL、App.config 的使用,找到了许多完成所需任务的替代方法(代码中有注释但未删除——有些有效,有些无效——但之后会被修改并由我完全研究),理解了 System.Data 的使用方法和逻辑,尝试使用不同的 SqlQuery,为自己找到了许多有趣的方法(例如——Distinct() ——一开始尝试实现它并花了一天多的时间),以及其他许多事情(我可以写到明天!)。

希望这个简短的描述能帮助到一些人。另外,我想感谢所有(来自不同地方)的帮助过我的人。

工作成果

历史

目前这是版本 0.0.0.4

  • 实现了每种引擎的基本变体

接下来做什么

  • 实现了数据库加载的线程——目前显示结果之前需要一点“思考”
  • 将项目迁移到 WPF
  • 修改了 DBEngine 的逻辑
  • 实现了皮肤
© . All rights reserved.