从没有数据库的程序中保存输入数据

时间:2019-05-28 11:39:33

标签: c# wpf

我正在构建一个简单的任务跟踪WPF应用程序,并且希望保存用户输入的数据而不使用数据库上的完整数据。

这是我要保存的一些示例数据。

  1. 日期
    • 创建/完成
  2. 任务(标题/说明)
  3. 活动状态为非活动状态
  4. 也许优先

我一直在阅读帖子,有人建议使用XAML的ini,CSV,app.config。我只想知道什么是我要完成的标准选择。可靠的东西使我的应用程序在部署后几乎不需要最终用户就可以运行。

2 个答案:

答案 0 :(得分:3)

您可以使用:

这些是我将按照个人喜好顺序使用的解决方案(一般的顺序,但这实际上取决于您需要执行的操作)

答案 1 :(得分:1)

作为示例,我将使用以下类作为要保存的顶级数据库“对象”:

[Serializable]
public class Model
{
    public string Data { get; set; }
}

AJAX可能是您选项中最常用的“简单”解决方案,即JSON或XAML。 JSON更适合“数据”,而XML更适合“文档”。

对于JSON,您可以执行以下操作:

var serializer = new JsonSerializer();

using (var stream = new StreamWriter("filename.dat"))
    serializer.Serialize(stream, model);

using (var stream = new StreamReader("filename.dat"))
using (var reader = new JsonTextReader(stream))
{
    var copy = serializer.Deserialize<Model>(reader);
}

哪个会生成如下文件:

{"Data":"Hello World!"}

对于XAML,您可以执行以下操作:

var model = new Model { Data = "Hello World!" };

var serializer = new XmlSerializer(typeof(Model));
using (var stream = new StreamWriter("filename.dat"))
    serializer.Serialize(stream, model);

using (var stream = new StreamReader("filename.dat"))
{
    var copy = serializer.Deserialize(stream) as Model;
}

哪个会生成如下文件:

<?xml version="1.0" encoding="utf-8"?>
<Model xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Data>Hello World!</Data>
</Model>

当然,如果您是个傻子,可以直接序列化为.NET二进制格式:

BinaryFormatter formatter = new BinaryFormatter();

using (var stream = new FileStream("filename.dat", FileMode.Create))
    formatter.Serialize(stream, model);

using (var stream = new FileStream("filename.dat", FileMode.Open))
{
    var copy = formatter.Deserialize(stream) as Model;
}

反过来,这将创建一个完全没有用的文件。

不幸的是,所有这些“解决方案”都带有警告,每次使用时都需要将整个内容读写到内存中,要避免这种情况,恐怕您将不得不使用数据库。但是,如果您不想使用“完整”数据库,那么“精简”数据库又如何呢?具体来说,SQLite?优点包括:

  • 数据全部存储在本地文件中,位于您自己选择的位置。
  • 它是完全独立的,无需在目标计算机上安装数据库服务器。
  • 几乎在阳光下的每个平台都支持(它们都使用相同的格式)。
  • 与EntityFramework等ORM轻松集成。
  • 有大量免费的第三方实用程序,如LINQPad等,可让您直接打开并使用数据库文件。

将SQLite与EntityFramework之类的对象耦合起来特别方便,因为访问和写入数据库的代码非常简单:

using (var db = new DatabaseContext())
{
    foreach (var model in db.Models)
        // do something with the model here
}

这还意味着,一旦您的应用程序赚了一百万美元,并且您想要迁移到“适当的”数据库引擎,您就已经拥有了ORM架构。主要缺点是,特别是SQLite的初始设置有些烦人,但您只需执行一次即可。这是我自己的个人笔记,我将在使用它的每个项目中引用它们,尽情享受吧!

第1步-创建控制台或WPF应用程序

第2步-添加Nuget包System.Data.SQLite

第3步-添加Nuget包SQLite.CodeFirst(这还将安装Entity Framework作为依赖项)

第4步-添加模型和DatabaseContext类(网络上的大量引用显示了如何针对EF执行此操作)。

第5步-如下调整App.config文件:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
  </startup>
  <connectionStrings>
    <add name="MyDatabase" connectionString="data source=MyDatabase.db;foreign keys=True;password=password" />
  </connectionStrings>
</configuration>

第6步-添加对System.Configuration的引用,以便代码可以读取配置文件。

第7步-运行该应用程序,将在您首次创建DatabaseContext对象时创建数据库文件。