在 C# 应用程序中存储数据的最佳方法是什么

本文关键字:最佳 方法 是什么 数据 存储 应用程序 | 更新日期: 2023-09-27 18:34:49

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

在 C# 应用程序中存储数据的最佳方法是什么

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

通常,您将使用以下方法来读取和写入文件以获取路径:

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

因此,如果要将数据存储在名为"食谱"的文件夹中和名为"食谱.xml"的文件中,则可以执行以下操作:

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

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

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

然后,下一个更高级别的步骤是将这些文件流传递给用于读取和写入 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);
}

我建议在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

你也可以看看这个类似的问题。

这里有一篇关于 XML 与 .DB 的文章,它表明 XML 正在失去优势。

尝试使用SQLite,它是轻量级的便携式数据库http://www.sqlite.org/

最好的

选择是使用Sql Server Compact (http://www.microsoft.com/en-us/sqlserver/editions/2012-editions/compact.aspx1(。

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

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

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

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

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

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

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