C# 第一次发布时写入,但之后不要覆盖

C# 第一次发布时写入,但之后不要覆盖,c#,visual-studio,publish,C#,Visual Studio,Publish,我已经通过VisualStudio发布了一个使用access数据库的应用程序,起初数据库是空的,在运行发布的应用程序时,我已经向数据库添加了数据 现在,我想用我对表单所做的更改来更新应用程序,并向原始表中添加一个新表和列 然而,我想保留数据库中新添加的数据,但到目前为止,我找不到这样做的方法,表单要么保持原样,要么数据库被删除 有人知道我怎么做吗 这里有一个小片段(未经测试!!)。您将不得不调整一些值,但它应该让您开始。它使用Access互操作,复制数据库,从新部署的数据库中删除所有表,从旧数据

我已经通过VisualStudio发布了一个使用access数据库的应用程序,起初数据库是空的,在运行发布的应用程序时,我已经向数据库添加了数据

现在,我想用我对表单所做的更改来更新应用程序,并向原始表中添加一个新表和列

然而,我想保留数据库中新添加的数据,但到目前为止,我找不到这样做的方法,表单要么保持原样,要么数据库被删除

有人知道我怎么做吗

这里有一个小片段(未经测试!!)。您将不得不调整一些值,但它应该让您开始。它使用Access互操作,复制数据库,从新部署的数据库中删除所有表,从旧数据库中导入表,然后删除临时文件

var dbPath = "[path to your db]";

var guid = Guid.NewGuid().ToString();
var tempPath = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonDocuments), guid);
System.IO.Directory.CreateDirectory(tempPath);
var tempDb = Path.Combine(tempPath, "[yourdbname]");
System.IO.File.Copy("[path to your db]", tempDb, true);

//copy the old database to this tempPath
//Overwrite the original old db with your new one
var access = new Microsoft.Office.Interop.Access.Application();
access.OpenCurrentDatabase(filepath: "[path to your db]", Exclusive: true, bstrPassword: "");
var newdb = access.CurrentDb();
var tableList=new List<string>();
foreach (TableDef table in newdb.TableDefs)
{
    tableList.Add(table.Name);
    newdb.TableDefs.Delete(table.Name);
}
foreach (var table in tableList)
{
    access.DoCmd.TransferDatabase(AcDataTransferType.acImport, DatabaseTypeEnum.dbVersion140, tempDb,
        AcObjectType.acTable, table, table, false, false);
}
System.IO.Directory.Delete(tempPath, true);
var dbPath=“[path to your db]”;
var guid=guid.NewGuid().ToString();
var tempPath=System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonDocuments),guid);
System.IO.Directory.CreateDirectory(tempPath);
var tempDb=Path.Combine(tempPath,“[yourdbname]”);
System.IO.File.Copy(“[path to your db]”,tempDb,true);
//将旧数据库复制到此临时路径
//用新数据库覆盖原来的旧数据库
var access=新的Microsoft.Office.Interop.access.Application();
OpenCurrentDatabase(文件路径:“[path to your db]”,独占:true,bstrPassword:”);
var newdb=access.CurrentDb();
var tableList=新列表();
foreach(newdb.TableDefs中的TableDef表)
{
tableList.Add(table.Name);
newdb.TableDefs.Delete(table.Name);
}
foreach(表列表中的var表)
{
access.DoCmd.TransferDatabase(AcDataTransferType.acImport,DatabaseTypeEnum.dbVersion140,tempDb,
AcObjectType.acTable,表,表,假,假);
}
System.IO.Directory.Delete(tempPath,true);

这是什么类型的应用程序?首先将“旧”应用程序中的所有数据导出到(比如)一堆CSV或Excel文件中,然后替换数据库,然后将备份数据导入到新数据库中如何?或者更简单:将旧数据库复制到临时文件夹,部署新数据库,从旧数据库导入数据。删除旧数据库。有趣的想法@LocEngineer在新的更新中,我可以创建一个按钮,提示用户输入旧数据库的位置,然后它将读取所有表中的所有数据并将其输入新数据库?为什么,你的应用程序不知道数据库在哪里?是的,当然提示也可以,但有必要吗?@LocEngineer是的,应用程序知道它在哪里,但是我尝试复制旧数据库并将其粘贴到新数据库中,但没有效果。我还尝试将新文件复制到旧文件中,以尝试更新表单,但这不起作用。Hi@LocEngineer我目前正在尝试一点一点地实现代码,但是在运行代码一次后,如果失败,则似乎即使程序停止运行,与数据库的“连接”仍保持打开状态,我在catch语句
System.IO.Directory.Delete(tempPath,true)上尝试了以下几行代码;access.CloseCurrentDatabase()但是失败了,它阻止了我重试,因为我每次都必须重新启动计算机,有什么建议吗?输入
access.CloseCurrentDatabase()
和常规的
access.Quit()
最后
块中。这将确保连接在终止和进程终止时保持连接。您当然不必重新启动计算机。在最坏的情况下,现在您可以从TaskManager中删除任何剩余的进程。