卸载 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一样的毛玻璃效果?