在本地复制/缓存Azure数据库以供脱机使用。

时间:2016-09-23 16:12:14

标签: sql-server vba azure caching database-backups

我有一个连接到Azure数据库的软件,用于收集多种颜色的公式,以允许用户按照配方创建自己的产品。 基本上,当应用程序启动时,只有一个大数据库拉,拉下所有公式,用户可以根据需要简单地使用,修改甚至删除公式。

问题在于,在使用此软件的情况下,很少有持续的互联网连接,到目前为止,应用程序只是设计为在没有存在的情况下关闭。

我正在寻找一种解决方案,允许应用程序在应用程序启动时连接到数据库(如果存在连接)并在本地保存副本,或者如果没有连接,请检查本地保存复制工作。

我到处寻找,但一直无法找到任何方法来编程"检索相关(或所有,如果需要)数据,并将其导出到本地文件,或以某种方式缓存它以供离线使用。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

您没有提及您在客户端使用的技术类型,以及您是否需要访问客户端上的数据库或仅访问数据 - 但无论有多种方法可以执行此操作

Azure移动应用程序有一个快速入门,可以实现Azure SQL< - > SQL Lite(移动)数据库同步框架(服务器端的表控制器)。这使您可以使用移动端的库来使用本地数据库来获取其数据,当您知道自己在线时,可以与服务器同步。这非常复杂,可能不仅仅提供您正在寻找的缓存。

我已经使用了另外两种缓存策略 - 一种用于基于HTML / javascript的应用程序(phonegap / cordova),另一种用于iOS和Android上的Xamarin c#应用程序。我假设它是一个标准的Windows桌面应用程序,你知道如何保存数据,这样你就可以使用你喜欢的任何类型的缓存/文件系统/ db。

JavaScript / html - 使用html5 localStorage函数存储您正在制作的Web服务器调用的JSON输出。这非常容易抽象,之前您的应用程序正在对服务器进行ajax调用以获取一些数据,而不是将其移动到" liveorcache" class,可以确定是去服务器还是只使用本地存储。用于在localstorage中保存/加载json的代码片段:

  $scope.saveFixtures = function () {
    localStorage["fixtures"] = JSON.stringify($scope.fixtures);
  };

  $scope.loadFixtures = function () {
    if (localStorage["fixtures"] != undefined) {
      $scope.fixtures = JSON.parse(localStorage["fixtures"]);
    }
  };

如果您在Xamarin中编写应用程序,您可以执行相同类型的操作,但使用PCL库 - 我使用了" PCLStorage"适用于Android和iOS。但是,在我的代码中,我只是将JSON数据写入具有适当文件名的文件,但通常将该对象包装在包含缓存写入日期/时间的另一个对象中。然后,您将对象序列化为文件 - 如下所示。

public class CacheProvider
{
public static async Task<CacheModel> ReadCache<T>(string filename)
{
  IFolder rootFolder = FileSystem.Current.LocalStorage;
  IFolder cache = await rootFolder.CreateFolderAsync("sportenzaCache", CreationCollisionOption.OpenIfExists);
  try
  { 
    IFile file = await cache.GetFileAsync(filename);
    var data = await file.ReadAllTextAsync();
    return JsonConvert.DeserializeObject<T>(data) as CacheModel;
  }
  catch(FileNotFoundException ex)
  {
    return null;
  }
}

public static async void WriteCache<T>(string filename, CacheModel data)
{
  IFolder rootFolder = FileSystem.Current.LocalStorage;
  IFolder cache = await rootFolder.CreateFolderAsync("sportenzaCache", CreationCollisionOption.OpenIfExists);
  IFile file = await cache.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting);
  if (file != null)
  {
    data.CacheCreated = DateTime.Now;
    string json = JsonConvert.SerializeObject(data);
    await file.WriteAllTextAsync(json);
  }
}

public static async void DeleteCache(string filename)
{
  IFolder rootFolder = FileSystem.Current.LocalStorage;
  IFolder cache = await rootFolder.CreateFolderAsync("sportenzaCache", CreationCollisionOption.OpenIfExists);
  IFile file = await cache.GetFileAsync(filename);
  if (file != null)
    await file.DeleteAsync();
}
}