【问题标题】:What is the best way to store data in c# application [closed]在 C# 应用程序中存储数据的最佳方式是什么[关闭]
【发布时间】:2013-10-09 19:09:42
【问题描述】:

我想制作 Cookbook 应用程序来存储和阅读(和更新)菜谱,或者其他任何东西来练习 OOP 编程和思考。但是,我不确定在 c# (Visual Studio Express) 中哪种存储数据的方式(在这种情况下为食谱)是最好的。 我想在程序中优化保存和加载数据,但我没有经验。什么是最好的方法?它是通过 XML、SQL 还是纯 TXT?还是其他方式?

【问题讨论】:

  • 为什么要专门优化存储效率?是为了学习经验,还是实际上是为了 coobook 应用程序?对我来说,这听起来不像是需要最优化存储的应用程序。此外..您希望以何种方式对其进行优化?低存储空间、易用性/可读性、便携性、性能?
  • 为什么不继续使用 SQL 和 XML 分别进行多个实现呢?听起来这完全是为了学习,而不是学校/工作,所以没有时间限制,对吧?
  • 如果我写了不该写的东西,我很抱歉,我看到人们给了我减号。不,我暂时不想申请,我只想练习。没有人需要这方面的食谱应用程序。我对关闭应用程序后如何保留数据感兴趣。
  • 从一开始就让你的模型不可知论。
  • 为什么会有这样的问题?我必须以某种方式学习,阅读人们的意见似乎是一种好方法,我很感激所有的答案。

标签: c# oop dataset storage datasource


【解决方案1】:

如果您还没有这样做,最好先从 XML 文件输入/输出开始,然后再进行任何太高级的操作。

通常你会通过使用以下方法来读取和写入文件来获取路径:

string appDataPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);

因此,如果您想将数据存储在名为“Cookbook”的文件夹和名为“recipes.xml”的文件中,您可以执行以下操作:

string dataPath = Path.Combine(appDataPath, "Cookbook");
string recipesFileFullPath = Path.Combine(dataPath, "recipes.xml");

这会为您提供类似C:\Users\John\AppData\Local\Cookbook\recipes.xml 或类似的路径,您可以将其传递给文件输入和输出函数。

然后您可以开始使用System.IO 命名空间类,例如File 和FileStream,以了解如何正确打开和读取/写入文件。

然后下一个更高级别的步骤是将这些文件流传递给用于读取和写入 XML 到对象的东西,例如 Linq to XML(XDocument 类),这是首选方法。或较旧的XmlSerializer。

编辑:

以下是一些创建对象并将其保存到 XML 文件的示例代码:

public class RecipeBook
{
    public List<Recipe> Recipes { get; set; }

    public RecipeBook()
    {
        Recipes = new List<Recipe>();
    }
}

public class Recipe
{
    public DateTime LastModified { get; set; }
    public DateTime Created { get; set; }
    public string Instructions { get; set; }
}

public void SomeFunction()
{
    RecipeBook recipeBook = new RecipeBook();

    var myRecipe = new Recipe()
    {
        Created = DateTime.Now,
        LastModified = DateTime.Now,
        Instructions = "This is how you make a cake."
    };

    recipeBook.Recipes.Add(myRecipe);

    var doc = new XDocument();
    using (var writer = doc.CreateWriter())
    {
        var serializer = new XmlSerializer(typeof(RecipeBook));

        serializer.Serialize(writer, recipeBook);
    }

    doc.Save(recipesFileFullPath);
}

您只需要将这段代码分解成适合您的结构。例如,如果您正在制作 Windows 窗体应用程序,那么 RecipeBook 将是主窗体的私有成员变量。在构造函数中,您可以构造recipesFileFullPath 字符串并将其存储为私有成员变量。在 Form.Loaded 事件中,您可以检查 XML 文件是否已经存在,如果存在则加载它。如果不是,您将创建一个新的 RecipeBook 类,它是空的。您也可能只在用户单击保存按钮或引发 Form.Closing 事件时进行序列化和保存。

编辑:

要反序列化并从文件中读取,您可以执行以下操作:

var serializer = new XmlSerializer(typeof(RecipeBook));
using (var fs = new FileStream(recipesFileFullPath))
{
    RecipeBook book = (RecipeBook)serializer.Deserialize(fs);
}

【讨论】:

  • 我喜欢这个解决方案,听起来很棒!我想我会试试这个。谢谢!
  • 我会 +1 你的答案,但不幸的是我不能在这里太新。
  • @user2806097,请阅读stackoverflow.com/help/someone-answers
  • Trevor,您将如何使用此 XDocument 和 XmlSerializer 将文件中的数据读取到 recepieBook 中?我对这个解决方案很感兴趣。谢谢!
  • 编辑了我的答案。如果答案回答了您的问题,则应将答案标记为已接受。
【解决方案2】:

我建议在 SqlExpress 中使用 localDB。

Microsoft® SQL Server® 2012 Express 是一款功能强大且可靠的免费 提供丰富可靠的数据存储的数据管理系统 适用于轻量级网站和桌面应用程序。

http://blogs.msdn.com/b/sqlexpress/archive/2011/07/12/introducing-localdb-a-better-sql-express.aspx

http://technet.microsoft.com/en-us/library/hh510202.aspx

你也可以看看这个类似的question。

这里是 XML vs. DB 上的一篇文章,它表明 XML 正在失地。

【讨论】:

  • 谢谢,这很有用。
  • @user2806097,欢迎您。如果有帮助 +1?
  • 我很想给 +1,但我没有足够的“声誉”给 + 任何人。
【解决方案3】:

尝试使用 SQLite,它是轻量级的可移植数据库 http://www.sqlite.org/

【讨论】:

  • 这是免费软件吗?听起来很有趣。
【解决方案4】:

最好的办法是使用 Sql Server Compact (http://www.microsoft.com/en-us/sqlserver/editions/2012-editions/compact.aspx1)。

这是因为它嵌入在您的应用程序中,您无需在部署等中安装额外的库。它也是简单表格数据的良好存储点。

【讨论】:

    【解决方案5】:

    这在很大程度上取决于应用程序将保存多少数据以及您希望如何搜索这些数据。

    对于少量数据,可以使用包含 XML och JSON 的纯文本文件。对于大量数据,我推荐使用 SQL 服务器或 NOSQL 数据库(MongoDB 或 Raven)。

    【讨论】:

    • ServiceStack Redis 也是一个不错的 NoSQL 选择。
    【解决方案6】:

    这取决于很多事情,主要是您计划拥有多少食谱,以及您是否希望能够搜索、排序或设置食谱样式。

    文本文件是最简单的方法。您可以添加一些简单的搜索和订购功能。

    如果它有数百个,您可以使用 xml 和序列化程序来解决。它将允许您稍后为食谱设置样式,并为数据提供一些结构。如果您的食谱数以千计,那么这种方式可能会成为一场噩梦。

    最好的方法是数据库。 Sql Server Compact 是一个免费选项,它通过 Entity Framework 之类的东西与 c# 很好地连接起来。如果您还不熟悉数据库或 ado.net 或实体框架,则此选项将花费最长的时间。

    【讨论】:

    • 这仅用于学习目的,我只是对如何将数据保留在应用程序之外感兴趣,例如在数据库中。正如我所看到的,c# 和数据库之间的交互非常复杂,所以我想如果有一种更简单的方法,那可能是文​​本文件。我仍然对 XML 和 C# 交互感到困惑。
    猜你喜欢
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-06
    • 1970-01-01
    • 2012-10-03
    • 1970-01-01
    • 2021-12-05
    相关资源
    最近更新 更多