2014-08-27 76 views
0

基于服务的数据库对我来说是新的。我想创建一个简单的数据库应用程序:Visual Studio mdf数据库结构修改后发布丢失

  • 服务为基础的数据库 - >数据集(MDF)
  • LINQ到SQL(L2S)班

该应用程序将在安装很多单独的机器都有它自己的mdf数据库。 安装由Clickonce完成。

我的问题是:

  1. 发布我的申请,并于用户的机器上安装它
  2. 用户把一些数据存入数据库
  3. 事实证明,我们需要另一个表或列
  4. 用扩展数据库再次发布应用程序并安装在用户机器上
  5. 用户从新数据库开始并丢失原始数据!

(如果我不改变比所有数据的数据库结构是在明年Clickone更新后数据库)

问题:

如果我做了唯一的改变表 - 或添加表 - 修改有什么方法可以在下次Clickonce更新期间保留数据?

预先感谢您! Dave

+0

找到问题 [链接]暗示http://social.msdn.microsoft.com/Forums/windows/en-US/24ada8b9-7a27-4e86-a16a-d6a620d216a0/clickonce-deployment-of -access-database – 2014-08-28 14:19:22

+0

发现另一个提示:http://social.msdn.microsoft.com/forums/windows/en-us/4671a906-0755-438b-80a2-283a0eb5f392/clickonce-deployment-questions – 2014-08-28 14:24:23

回答

0

我找到了解决方案。 如果在Visual Studio中修改数据库模型Clickonce将在安装后自动重新创建所有表格(具有修改表格的新发布的应用程序)。 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(); 
     } 

祝你好编码! 戴夫