2012-03-15 79 views
4

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

我用一个本地.mdf文件启动了一个使用SQL的项目,但很快就意识到当我创建一个安装程序并安装到另一个系统上时。我得到一个错误,说没有找到SQL Server,因为该服务器没有安装SQL。

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

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

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

谢谢!

回答

0

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

3

你应该使用嵌入式数据库,然后它会创建一个数据库文件,你可以使用它就像一个正常的datbase(有一些例外)。 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)。

0

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

1

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

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

1

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

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

真实的业务数据要复杂得多,需要更先进的数据存储,如数据库。对于这一点,你有几种选择:

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

  • 嵌入式数据库引擎,如SQL Server Compact Edition或SQLite。我个人比较喜欢SQLite。它有一个.NET实现(System.Data.SQLite)。这些DBMS不需要任何安装,并且可以轻松地将它们部署到任何应用程序中。尽管它们有一些限制,但它们足够用于没有或很少并发数据访问的简单应用程序。
    SQLite的最重要的限制(我知道)是它没有行级锁定(只有表锁),它没有正确的外部联接(只有左外部联接)。另外外键约束默认关闭。第一个限制以某种方式降低了应用程序对并发数据访问(插入和更新)的响应性。其他的可以很容易地克服。

2

对于嵌入式RDBMS你不能去错了SQLite作为其Most Widely Deployed SQL Database这个星球上。这是一个基于文件的RDBMS,它可以工作,数据库是自包含的,甚至不需要存在,因为您可以在运行中透明地创建它。

我的ServiceStack's OrmLite维护SQLite的32位和64位提供程序,使其处理工作变得无足轻重,并提供对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

相关问题