Visual studio mdf数据库结构已修改,发布后丢失

本文关键字:修改 mdf studio 数据库 结构 Visual | 更新日期: 2023-09-27 18:19:55

基于服务的数据库对我来说是新的。我想用创建一个简单的数据库应用程序

  • 基于服务的数据库->数据集(mdf)
  • LINQ到SQL(L2S)类

该应用程序将安装在许多单独的计算机上,每个实例都有自己的mdf数据库。安装由Clickonce完成。

我的问题是:

  1. 我发布应用程序并将其安装在用户计算机上
  2. 用户将一些数据放入数据库
  3. 原来我们需要另一个表或列
  4. 使用扩展数据库再次发布应用程序并安装在用户计算机上
  5. 用户从一个新数据库开始,原始数据丢失

(如果我没有修改数据库结构,那么在下一次Clickone更新后,所有数据都在数据库中)

问题:

如果我只做了类似于更改表或添加表的修改,那么在下一次Clickonce更新期间有什么方法可以保留数据吗?

提前谢谢!Dave

Visual studio mdf数据库结构已修改,发布后丢失

我找到了一个解决方案。如果您在visual studio中修改数据库模型,Clickonce将在安装后自动重新创建所有表(新发布的应用程序中有修改过的表)。单击一次将旧数据库保存到指定位置:

if (ApplicationDeployment.IsNetworkDeployed && ApplicationDeployment.CurrentDeployment.DataDirectory != null)
     string preDatabase = Path.GetFullPath(Path.Combine(ApplicationDeployment.CurrentDeployment.DataDirectory,@".pre'sampledatabase.mdf"));

这个.pre目录是由Clickonce创建的。您总是检查此文件是否存在。如果它存在,您必须将数据从旧表复制到新表,否则您将丢失旧表中的所有数据

如何将数据从一个数据库复制到另一个非常相似的数据库?我的答案如下:使用SqlBulkCopy将所有表复制到另一个表。

        // Create source connection
        using (
            var source =
                new SqlConnection(
                    String.Format(
                        @"Data Source=(LocalDB)'v11.0;AttachDbFilename={0};Integrated Security=True;",
                        preDatabase)))
        {
            source.Open();
            // Create destination connection
            using (var destination = new SqlConnection(Settings.Default.mdcdbConnectionString))
            {
                destination.Open();
                DataTable dt = source.GetSchema("Tables");
                foreach (string tablename in from DataRow row in dt.Rows select (string) row[2])
                {
                    App.Logger.LogText(String.Format("Copying table {0}", tablename));
                    using (var cmd = new SqlCommand(String.Format("TRUNCATE TABLE {0}", tablename), destination))
                    {
                        cmd.ExecuteNonQuery();
                        //App.Logger.LogText(String.Format("truncate table {0}", tablename));
                    }
                    using (var cmd = new SqlCommand(String.Format("SELECT * FROM {0}", tablename), source))
                    {
                        using (SqlDataReader reader = cmd.ExecuteReader())
                        {
                            var bulkData = new SqlBulkCopy(destination)
                                {
                                    DestinationTableName = tablename
                                };
                            // Set destination table name
                            bulkData.WriteToServer(reader);
                            // Close objects
                            bulkData.Close();
                            //App.Logger.LogText(String.Format("Copy success {0}", tablename));
                        }
                    }
                }
                destination.Close();
            }
            source.Close();
        }

祝你编码好!Dave