MyHomeLibrary 或我在 C# .NET 中尝试不同的数据管理方法
.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.cs 和 LibrayStock.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
中的 XMLDocument
和 XMLElement
。这不是实现这个类的一个方法,而是比前一个更合乎逻辑且最简单的方法。
在创建这个类时,我尝试使用一些 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 的逻辑
- 实现了皮肤