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

时间:2013-10-09 19:09:43

标签: c# oop dataset storage datasource

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

6 个答案:

答案 0 :(得分:9)

如果你还没有这样做,最好先从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命名空间类,例如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);
}

答案 1 :(得分:7)

我建议在SqlExpress中使用localDB。

  

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

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正在失势。

答案 2 :(得分:2)

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

答案 3 :(得分:0)

您最好的选择是使用Sql Server Compact(http://www.microsoft.com/en-us/sqlserver/editions/2012-editions/compact.aspx 1)。

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

答案 4 :(得分:0)

这取决于应用程序将拥有多少数据以及您希望如何搜索该数据。

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

答案 5 :(得分:0)

这取决于很多事情,主要是你计划使用多少食谱,以及你是否希望能够对食谱进行搜索,分类或样式化。

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

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

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