在Windows窗体应用程序中存储数据的最佳方法是什么?
我使用带有本地.mdf文件的SQL启动了一个项目,但很快就意识到当我创建安装程序并安装在另一个系统上时。我收到一条错误,说找不到SQL Server,因为该服务器没有安装SQL。
将安装此应用程序的目标系统将不安装SQL。
所以我的问题是:什么是常态?如何在Windows窗体应用程序中存储和访问数据?它真的是.mdf SQL数据库,还是某种类型的sqlite DB?
如果我可以使用某种SQL数据库(mdf文件),也不必在每台客户端计算机上安装SQL Server。我该怎么做呢?
谢谢!
答案 0 :(得分:8)
现在有SQL Server Compact Edition。这已编译到您的应用程序中。最终用户不需要任何其他版本的SQL Sever来使用您的应用程序。见http://www.microsoft.com/sqlserver/en/us/editions/compact.aspx
答案 1 :(得分:3)
然后你应该使用嵌入式数据库。 SQL Server Compact Edition是一个嵌入式数据库。此维基百科链接指向其他嵌入式数据库:
http://en.wikipedia.org/wiki/Embedded_database
请注意,并非所有内容都是免费的。
答案 2 :(得分:3)
这个问题的答案非常重要。我假设您存储的是实际内容,而不仅仅是设置或窗口位置。第一种选择是使用其中一个内置序列化程序来读/写XML或JSON。或者也许使用ServiceStack中的一个。
如果您无法轻松地将所有内容存储在内存中,那么我们可以考虑使用数据库。我唯一一次使用像MS SQL Server或Oracle这样的重量级数据库,那就是拥有管理数据库的全职工作人员的企业级应用程序。
对于简单的每个应用程序文件存储,您可以使用MS SQL Embedded或Express版本,但不能。这很慢。它有愚蠢的局限。如果你真的想走这条路,你可以在网上查看连接字符串参数以指向本地mdf文件。
相反,您应该使用Sqlite .NET包装器(现在由Sqlite.org管理和提供)。如果你想在它上面使用浅ORM,我也建议你这样做。您可以在该领域查看ServiceStack或其他一系列选项。 (只需对轻量级.net orm进行网络搜索)。
答案 3 :(得分:3)
对于嵌入式RDBMS,SQLite不会出错,因为它是地球上的Most Widely Deployed SQL Database。它是一个基于文件的RDBMS,只是工作,数据库是自包含的,甚至不需要存在,因为你可以在运行中透明地创建它。
我的ServiceStack's OrmLite维护着32位和64位SQLite提供程序,这使得它很容易使用,它具有对POCO的一流支持:自动表创建和对复杂属性类型的无模式文本blob的透明支持
可以从NuGet下载,有两种版本:
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");
}
答案 4 :(得分:2)
如果您真的想使用SQL,可以使用SQL Server Compact版。它将创建一个db文件,您可以像普通数据库一样使用它(有一些例外)
http://www.microsoft.com/sqlserver/en/us/editions/compact.aspx
答案 5 :(得分:1)
您还可以使用SQLite,这是一个将数据存储在平面文本文件中的免费数据库。有.NET library与SQLite数据文件进行交互。
另一个不错的好处是SQLite受到许多不同语言的支持。 SQLite最初是为C / C ++编写的,但现在Python有一个内置的SQLite模块。 SQLite也常用于Java,Ruby等等。
答案 6 :(得分:1)
这主要取决于您要存储的数据类型。
应用程序设置和用户配置是程序存储的一种数据。这类数据通常存储在xml配置文件或Windows注册表中。
真正的业务数据要复杂得多,需要更高级的数据存储,比如数据库。为此,您有几个选择:
全功能数据库引擎,如MS SQL Server(Express),MySql或PostgreSQL。这些DBMS都需要一个应该安装在应该存储数据的计算机上的服务器应用程序。
嵌入式数据库引擎,如SQL Server Compact Edition或SQLite。我个人更喜欢SQLite。它有一个.NET实现(System.Data.SQLite)。这些DBMS不需要任何安装,可以轻松地与任何应用程序一起部署。虽然它们有一些限制,但它们足以用于没有或几乎没有并发数据访问的简单应用程序 SQLite(我所知道的)最重要的限制是它没有行级锁定(只有表锁定),并且它没有右外连接(只有左外连接)。默认情况下,外键约束也会被关闭。第一个限制以某种方式降低了应用程序对并发数据访问(插入和更新)的响应性。其他的可以轻松克服。
答案 7 :(得分:0)
您可以在应用程序的安装中插入ms sql express的安装或保存数据,如果它们不是xml格式或ms office acess db。
答案 8 :(得分:0)
除了已经提到的其他选项,您还可以考虑使用MS Access数据库(JET引擎)。开箱即用,您可以使用Access轻松管理数据。