2013-01-24 98 views
1

我有一個Azure雲應用程序,我試圖將用戶上傳的數據存儲在位於〜/ AppData/mydb.db中的SQLite數據庫中。由於我在部署System.Data.SQLite時遇到了許多問題,因此我修改了我的代碼以使用這個sharp-sqlite庫。在調試模式下插入數據時一切正常。Azure SQLite插入

在Azure上部署時,將用戶提供的數據插入到SQLite數據庫中。在此過程中不會出現錯誤。但是,當試圖查看數據(現在應該存在於數據庫中)時,什麼也沒有。我還在我的網絡應用程序中添加了一個鏈接,以便我可以下載數據庫。下載它證實數據沒有被保存。

Azure似乎阻止了數據庫的更新。有沒有人遇到類似的問題。

下面是代碼的樣本,我使用:

Community.CsharpSqlite.SQLiteClient.SqliteConnection cnn = new SqliteConnection("data source=file:" + Server.MapPath(@"~\App_Data\mydb.db")); 
cnn.Open(); 

cmd.CommandText = "INSERT INTO Data(x,y,z) VALUES(?,?,?)"; 

System.Data.Common.DbParameter X = cmd.CreateParameter(); 
System.Data.Common.DbParameter Y = cmd.CreateParameter(); 
System.Data.Common.DbParameter Z = cmd.CreateParameter(); 

cmd.Parameters.Add(X); 
cmd.Parameters.Add(Y); 
cmd.Parameters.Add(Z); 

X.Value = "some" 
Y.Value = "sample" 
Z.Value = "data" 

cmd.ExecuteNonQuery(); 
dbTrans.Commit(); 

回答

2

你的經驗可能是您的方法的問題。

當您說「Azure雲」我假定您參考Azure Cloud Services(而不是Azure網站)。

至於Azure雲服務而言,部署服務包(服務包包含應用程序代碼和服務定義文件)應被視爲一個密封包裝不能用你的代碼進行修改。但是,您嘗試執行的操作是更新您的內部軟件包資源mydb.db文件(通過執行一些SQL插入操作,這會導致mydb.db文件更新)。

具有服務包的方法 *不可變*是通過設計。有幾點支持該決定:

  • 許多角色(同一類型)可以處理請求(假設您有多個特定Web角色的實例);這就是爲什麼您的服務包需要在所有實例中都相同。
  • Azure中執行的操作系統例行維護或補丁,並從服務包重新創建你的實例
  • 天青試圖從服務或硬件故障中恢復 - 再次,您的實例已經從服務包重建

我認爲使用Azure雲服務的最佳解決方案是使用雲優化解決方案,如Azure SQL數據庫。

如果您確實需要使用SQLite,我會推薦使用Azure Website而不是Azure Cloud Services。使用Azure網站時,您資源的更改將會更新,並可通過其他網站實例查看。

+1

我正在做類似的事情,並使用天藍色的網站,我可以讀取和寫入SQLite Db沒有問題。湯姆現身。 – ElvisLives

+0

@Tom,對於Azure網站,我認爲相同的「密封部署包」概念是適用的? Azure網站可以擴展爲多個實例,在這種情況下,不是隻能寫入單個實例的寫入?另外,我確實意識到這個答案已經過了一年多了,也許Azzure網站的工作方式已經改變了? – Josh

+0

@Josh,Azure網站使用標準SMB 2.1協議基於Azure Blob共享文件系統。儘管Azure網站實例是獨立的(例如,一個實例的崩潰不會影響其他實例),但它們共享相同的文件系統,因此所有其他實例可以看到一個實例寫入的更改。 – Tom