【问题标题】:How to store data in a .net windows application如何在 .net windows 应用程序中存储数据
【发布时间】:2012-03-15 18:02:47
【问题描述】:

在 Windows 窗体应用程序中存储数据的最佳方式是什么?

我使用带有本地 .mdf 文件的 SQL 开始了一个项目,但很快意识到当我创建一个安装程序并安装在另一个系统上时。我收到一条错误消息,提示找不到 SQL Server,因为该服务器没有安装 SQL。

将安装此应用程序的目标系统不会安装 SQL。

所以我的问题是:规范是什么? Windows 窗体应用程序中通常如何存储和访问数据?它真的是一个 .mdf SQL 数据库,还是某种类型的 sqlite DB?

如果我可以使用某种 SQL 数据库(mdf 文件),而不必在每台客户端计算机上安装 SQL 服务器。我该怎么做呢?

谢谢!

【问题讨论】:

    标签: c# .net visual-studio


    【解决方案1】:

    现在有 SQL Server Compact Edition。这会直接编译到您的应用程序中。最终用户不需要任何其他版本的 SQL Sever 即可使用您的应用程序。见http://www.microsoft.com/sqlserver/en/us/editions/compact.aspx

    【讨论】:

      【解决方案2】:

      那么您应该使用嵌入式数据库。 SQL Server Compact Edition 是一个嵌入式数据库。此维基百科链接指向其他嵌入式数据库:

      http://en.wikipedia.org/wiki/Embedded_database

      请注意,并非所有都是免费的。

      【讨论】:

        【解决方案3】:

        这个问题的答案很重要。我假设您存储的是实际内容,而不仅仅是设置或窗口位置。第一种选择是使用一个内置的序列化程序来读/写 XML 或 JSON。或者也许使用 ServiceStack 中的一个。

        如果您不能将所有内容轻松存储在内存中,那么我们可以考虑使用数据库。唯一一次我会使用像 MS SQL Server 或 Oracle 这样的重量级数据库是你拥有一个企业级应用程序,其中有全职员工来管理数据库。

        对于每个应用程序的简单文件存储,您可以使用 MS SQL Embedded 或 Express 版本,但不要。它很慢。它有愚蠢的限制。如果你真的想走这条路,你可以在线查看连接字符串参数以指向本地 mdf 文件。

        相反,您可能应该使用 Sqlite .NET 包装器(现在由 Sqlite.org 管理和提供)。如果您想在此之上使用浅 ORM,我也建议您这样做。您可以查看 ServiceStack 或该领域的大量其他选项。 (只需在网络上搜索轻量级 .net orm)。

        【讨论】:

          【解决方案4】:

          对于嵌入式 RDBMS,使用 SQLite 不会出错,因为它是地球上的 Most Widely Deployed SQL Database。它是一个基于文件的 RDBMS,可以正常工作,数据库是自包含的,甚至不需要存在,因为您可以透明地动态创建它。

          我的ServiceStack's OrmLite 维护着 32 位和 64 位的 SQLite 提供程序,这使得使用它变得微不足道,它对 POCO 的一流支持:自动表创建和对复杂属性类型的无模式文本 blob 的透明支持。

          可从 NuGet 下载 2 种风格:

          这是simple web service example

          using (IDbConnection db = "~/App_Data/db.sqlite".OpenDbConnection())
          using (IDbCommand dbCmd = db.CreateCommand()) {
          
               dbCmd.DropTable<Author>();
               dbCmd.CreateTable<Author>();
          
               var authors = new List<Author> {
                    new Author { Name = "Demis Bellot" ... },
                    new Author { Name = "Angel Colmenares" ... },
               };
               dbCmd.InsertAll(authors); 
          
               dbCmd.Select<Author>(q => q.Birthday >= new DateTime(agesAgo, 1, 1) 
                    && q.Birthday <= new DateTime(agesAgo, 12, 31));
               dbCmd.Select<Author>(q => Sql.In(q.City, "London", "Madrid", "Berlin"));
               dbCmd.Select<Author>(q => q.Name.StartsWith("A"));
               dbCmd.Select<Author>(q => q.Name.EndsWith("garzon"));
               dbCmd.Select<Author>(q => q.Name.ToUpper().EndsWith("GARZON"));
               dbCmd.Select<Author>(q => q.Name.Contains("Benedict"));
               dbCmd.Select<Author>(q => q.Eaqings <= 50);
               dbCmd.Select<Author>(q => q.Rate == 10 && q.City == "Mexico");
          
          }
          

          还有一个screenshot of the results

          【讨论】:

            【解决方案5】:

            如果你真的想使用 SQL,你可以使用 SQL Server Compact 版本。它将创建一个 db 文件,您可以像使用普通数据库一样使用它(有一些例外)

            http://www.microsoft.com/sqlserver/en/us/editions/compact.aspx

            【讨论】:

              【解决方案6】:

              您还可以使用SQLite,这是一个免费的数据库库,可将数据存储在纯文本文件中。有一个.NET library 可以与 SQLite 数据文件交互。

              另一个不错的好处是 SQLite 支持多种不同的语言。 SQLite 最初是为 C/C++ 编写的,但现在 Python 有一个内置的 SQLite 模块。 SQLite 也常用于 Java、Ruby 等。

              【讨论】:

                【解决方案7】:

                这主要取决于您要存储什么样的数据。

                应用程序设置和用户配置是程序存储的一种数据。这种数据通常存储在xml配置文件或windows注册表中。

                真正的业务数据要复杂得多,需要更高级的数据存储,例如数据库。为此,您有几个选择:

                • 功能齐全的数据库引擎,如 MS SQL Server (Express)、MySql 或 PostgreSQL。这些 DBMS 都需要一个服务器应用程序,该应用程序应安装在应存储数据的计算机上。

                • 嵌入式数据库引擎,如 SQL Server Compact Edition 或 SQLite。我个人更喜欢 SQLite。它有一个 .NET 实现 (System.Data.SQLite)。这些 DBMS 不需要任何安装,它们可以很容易地与任何应用程序一起部署。虽然它们有一些限制,但它们对于没有或很少并发数据访问的简单应用程序来说已经足够了。
                  SQLite 最重要的限制(我知道)是它没有行级锁定(只有表锁定),它没有右外连接(只有左外连接)。默认情况下,外键约束也是关闭的。第一个限制以某种方式降低了应用程序对并发数据访问(插入和更新)的响应能力。其他的很容易克服。

                【讨论】:

                  【解决方案8】:

                  您可以在应用程序的安装中插入 ms sql express 的安装或保存数据(如果它们不是 xml 格式或 ms office acess db 的话)。

                  【讨论】:

                    【解决方案9】:

                    除了已经提到的其他选项,您可以考虑使用 MS Access 数据库(JET 引擎)。开箱即用,您可以使用 Access 轻松管理数据。

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 2012-02-16
                      • 2017-03-21
                      • 2016-12-19
                      • 2014-10-26
                      • 2016-10-28
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多