2010-04-15 55 views
2

今天我使用SQLite併發送一個帶有項目的數據庫文件。SQLite - 實時創建和更改數據庫

但是我想在用戶第一次啓動軟件時創建數據庫。

有沒有辦法根據現有的數據庫複製創建數據庫所需的代碼?問題是當用戶下載一個新版本時,他可能會被騙入他的最後一個數據庫並丟失數據。我想要一個很好的方法來檢查數據庫的版本並修改它,如果我需要新的列或表等。或者,如果它根本不存在,創建一個新的數據庫?

我知道我大概可以創建從一開始就創建數據庫的代碼,但我希望它是基於gui創建的現有數據庫。

已回答。最終代碼:

  //Copy the database from the resource 
      using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("resourcename")) 
      { 
       if (stream == null) 
        throw new NullReferenceException("Stream is null. Cannot find the database in the resources"); 
       FileStream writer = new FileStream(Constants.SqLiteFile, FileMode.Create); 
       int Length = 256; 
       Byte[] buffer = new Byte[Length]; 
       int bytesRead = stream.Read(buffer, 0, Length); 
       // write the required bytes 
       while (bytesRead > 0) 
       { 
        writer.Write(buffer, 0, bytesRead); 
        bytesRead = stream.Read(buffer, 0, Length); 
       } 
       stream.Close(); 
       writer.Close(); 
      } 

回答

1

嗯......我想你可以在兩個sqlite數據庫之間做一個sinchronization,我的想法是獲取每個數據庫的表和字段,然後遍歷它們以查看哪些表和字段在一個而不是在另一個。

要開始使用,這些查詢可能對您有用。

-- For getting tables in current db 
SELECT name FROM sqlite_master WHERE type = 'table' ORDER BY name; 

-- For getting info about a table 
PRAGMA table_info('tabla_name'); 
+0

太棒了!好主意,感謝您的查詢,最有幫助。有些擔心:我希望能夠在沒有數據庫的情況下運送我的軟件。這意味着我沒有要比較的數據庫,我不能使用您提供的代碼創建數據庫。我想也許嵌入數據庫作爲資源(這是可能的),然後將其複製到本地,如果不存在。然後我可以與它比較。是否有可能將數據庫作爲資源? – 2010-04-15 17:43:57

+0

確定你可以,嵌入它,然後你可以讀取它像這樣的指令:GetType()。Assembly.GetManifestResourceStream(「name of resource」); – 2010-04-15 18:31:56

+0

不要忘記將編譯操作置於「嵌入式資源」 – 2010-04-15 18:32:59

0

這聽起來像你只需要一個位置來保存他們的當前系統的版本。創建一個配置表並擁有一個記錄,以維護創建/更新數據庫的任何版本。當他們運行安裝程序/升級時,請檢查該版本是否存在,以及/或者確定要採取哪些步驟的版本。

+0

問題不是檢查要做什麼,我可以弄清楚。只需將數據庫版本保存在數據庫中即可。我想知道的是如何編寫代碼來執行更改? – 2010-04-15 16:13:09

+0

這取決於你如何記錄變化以及你在做什麼。顯然你可以發出一個ALTER TABLE命令並添加/更新列。你只需要知道版本之間缺少什麼以知道你想要做什麼。 – Thyamine 2010-04-15 16:47:36

+0

是的,這基本上就是我要求的。如何知道與數據庫有什麼不同,以及從scrach創建一個新的(基於我的) – 2010-04-15 17:45:02