2013-01-24 68 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