Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Visual studio mdf数据库结构已修改,但在发布后丢失_C#_Database_Clickonce - Fatal编程技术网

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

C# Visual studio mdf数据库结构已修改,但在发布后丢失,c#,database,clickonce,C#,Database,Clickonce,基于服务的数据库对我来说是新的。我想创建一个简单的数据库应用程序,包括: 基于服务的数据库->数据集(mdf) LINQ到SQL(L2S)类 此应用程序将安装在许多单独的机器上,每个实例都有自己的mdf数据库。 通过单击一次即可完成安装 我的问题是: 我发布应用程序并将其安装在用户计算机上 用户将一些数据放入数据库 结果我们需要另一个表或列 使用扩展数据库再次发布应用程序,并在用户计算机上安装 用户从新数据库开始,原始数据丢失 (如果我没有修改数据库结构,则在下一次单击一次更新后,数据库中的

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

  • 基于服务的数据库->数据集(mdf)
  • LINQ到SQL(L2S)类
此应用程序将安装在许多单独的机器上,每个实例都有自己的mdf数据库。 通过单击一次即可完成安装

我的问题是:

  • 我发布应用程序并将其安装在用户计算机上
  • 用户将一些数据放入数据库
  • 结果我们需要另一个表或列
  • 使用扩展数据库再次发布应用程序,并在用户计算机上安装
  • 用户从新数据库开始,原始数据丢失 (如果我没有修改数据库结构,则在下一次单击一次更新后,数据库中的所有数据都已存在)

    问题:

    如果我只做了alter table或add table-like修改,有没有办法在下次Clickonce更新期间保留数据

    提前谢谢你! 戴夫

    我找到了解决办法。 如果在VisualStudio中修改数据库模型,则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找到了问题的提示[link]找到了另一个提示: