卸载 Windows 移动应用程序时,如何在设备上保留 SQL CE 数据库和现有数据?

Posted

技术标签:

【中文标题】卸载 Windows 移动应用程序时,如何在设备上保留 SQL CE 数据库和现有数据?【英文标题】:While unsitalling the Windows mobile application , how to Keep SQL CE Database with Existing DataOn device? 【发布时间】:2011-12-26 11:29:48 【问题描述】:

我有一个 Windows mobile 6 应用程序。当服务器上有可用的新补丁时,它将下载新的 Cab 文件并使用以下代码在设备上以编程方式安装

Process proc = Process.Start("wceload.exe", "\"" + Path.Combine(applicationPath, updateFileName) + "\"");
  proc.WaitForExit();

但这也删除了现有的数据库 [Sql CE] 和有价值的数据。

我需要将数据库保留在设备上并卸载应用程序并安装新的 cab 文件,而无需在安装新 cab 的同时再次安装 Fresh DB...

我怎样才能做到这一点...帮我解决这个问题????

【问题讨论】:

我删除了 Windows Phone 7 标签,因为它是不同的架构。 【参考方案1】:

在卸载之前,备份数据库文件(通常是 .sdf)。安装后,用您的备份替换新的数据库文件。

// backup the CE database
string databasePath = ""; // location of your database
string backupPath = ""; // choose a backup path
try

    File.Copy(databasePath, backupPath);

catch 

    Trace.TraceError("Error creating backup");



Process proc = Process.Start("wceload.exe", "\"" + Path.Combine(applicationPath, updateFileName) + "\"");
proc.WaitForExit();

然后,重新安装后,删除新的 CE 数据库并恢复备份:

if (File.Exists(databasePath))

    try 
    
         File.Delete(databasePath);
    
    catch 
    
         Trace.TraceError("Error deleting new database");
    


string databasePath = ""; // location of your database
string backupPath = ""; // choose a backup path
try

    File.Copy(backupPath , databasePath);

catch 

    Trace.TraceError("Error restoring backup");

如果您无法删除新数据库,因为它正在使用中,您需要想出一种机制来解决这个问题(例如,重命名新数据库,然后复制您的备份,然后重新启动您的应用程序/设备)

【讨论】:

我可以按程序进行吗? C# 代码示例对我最有用...请帮助我【参考方案2】:

digginforfire 的代码将允许您防止该数据库被删除。

不过,就我个人而言,我认为最好编写代码来确保这不是必需的。例如,您的应用程序应在尝试加载数据库之前检查Application Data 文件夹中的数据库是否存在。如果数据库不存在,您只需创建它。

复制和修改 Microsoft 示例的版本 >> HERE <<,你会得到这样的:

string appPath = string.Format(@"01213",
    Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
    Path.DirectorySeparatorChar, "MyCompany", "MyProduct"
  );

string dbFile = "database.swf";
string dbFilePath = Path.Combine(appPath, dbFile);
if (!File.Exists(dbFilePath)) 
  string connStr = string.Format("Data Source=0; Password =1", dbFilePath, "1234567");
  using (SqlCeEngine engine = new SqlCeEngine(connStr)) 
    engine.CreateDatabase();
  
  using (SqlCeConnection conn = new SqlCeConnection(connStr)) 
    try 
      conn.Open();
      using (SqlCeCommand cmd = new SqlCeCommand("CREATE TABLE myTable (col1 int, col2 ntext)", conn)) 
        cmd.ExecuteNonQuery();
      
     catch   finally 
      conn.Close();
    
  

这将确保在您的产品卸载后数据库仍然存在。

【讨论】:

但是,上面的代码只会创建新的数据库对吗?我需要现有的有价值的数据以及数据库。如何将数据库保留在应用程序文件夹中,并且在重新安装应用程序时,不要安装 Fresh DB 而不是现有数据库。 是的,如果数据库不可用,代码将创建一个新数据库。否则,它将使用已经存在的数据库。通过让您的应用程序在代码中创建数据库,而不是通过 CAB 安装程序安装它,无论何时卸载应用程序,数据库都不会被删除。 此外,每当您为应用程序安装更新时,数据库已经存在,因此它只是开始使用数据库。如有其他问题,请追问! 先生,听起来不错...但是...我想在设备上安装新的出租车...此时,我们如何才能防止仅删除本地数据库[卸载时]。以及我把这段代码放在哪里,检查本地数据库是否已经在设备中可用......如果你不介意请给我测试它的步骤...... 先备份你的数据库,就像 dinggingforfire 说的那样。我的版本只是为了防止您在下一个项目中手动备份数据库。

以上是关于卸载 Windows 移动应用程序时,如何在设备上保留 SQL CE 数据库和现有数据?的主要内容,如果未能解决你的问题,请参考以下文章

Delphi 编写的程序中,如何让程序实现像Windows7一样的毛玻璃效果?

如何在我的 Windows 桌面上运行 localhost 的移动设备上运行我的 Angular 站点[重复]

如何查看jdk安装路径?

如何卸载卡巴斯基移动安全[关闭]

windows上如何卸载C语言编译器MinGW?

如何在真机(手机)上开发windows 10 uwp?