2012-03-15 82 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

相關問題