2009-01-07 155 views

回答

3

使用ExecTask并调用sqlcmd.exe或cmd脚本来完成对数据库的任何操作。

2

我们使用ExecTask和powershell脚本。相关PowerShell代码是在这里:

$Server = new-object ("Microsoft.SqlServer.Management.Smo.Server") $ServerName 
$Database = new-object ("Microsoft.SqlServer.Management.Smo.Database") ($Server, $DatabaseName) 

function RestoreDb([string] $BackupFile = $(throw "Backup file required.")) 
{ 

    write-host "Taking db offline" 
    $Database.SetOffline() 
    $restore = new-object ('Microsoft.SqlServer.Management.Smo.Restore') 


    $fil=new-object "Microsoft.SqlServer.Management.Smo.BackupDeviceItem" 
    $fil.DeviceType='File' 
    $fil.Name= $BackupFile 
    $restore.Action="Database" 
    $restore.Devices.Add($fil) 
    $restore.Database=$DatabaseName 
    $restore.ReplaceDatabase = $true 
    $restore.Restart = $true 
    write-host "Restoring database $DatabaseName on $ServerName from file $BackupFile" 
    $restore.SqlRestore($Server) 
    write-host "Taking db online" 
    $Database.SetOnline() 
} 

及相关的MSBuild

<Exec WorkingDirectory="$(BuildRoot)" Command="powershell -command .\run_migration.ps1"/> 
2

下面是一个MSBuild任务的我写了这样做的轮廓:

public class RestoreDb : Task 
    { 
     #region RequiredParameters 
     [Required] 
     public string ServerName 
     { 
      get 
      { 
       return m_ServerName; 
      } 
      set 
      ... 
     } 
     [Required] 
     public string DbName 
     ... 
     public string BackupFileName 
     ... 
     #endregion 
     public override bool Execute() 
     { 
      try 
      { 
       SqlConnectionStringBuilder connectionStringBuilder = new SqlConnectionStringBuilder(); 
       connectionStringBuilder.IntegratedSecurity = true; 
       connectionStringBuilder.DataSource = ServerName; 
       SqlConnection connection = new SqlConnection(connectionStringBuilder.ToString()); 
       connection.Open(); 

       Server server = new Server(new ServerConnection(connection)); 

       if (server.Databases[DbName] != null) 
       { 
        Log.LogMessage("Dropping existing " + DbName + " on " + ServerName); 
        server.Databases[DbName].Drop(); 
       } 
       else 
       { 
        Log.LogMessage(DbName + " on " + ServerName + " doesn't exist."); 
       } 

       Log.LogMessage(MessageImportance.High, "Restoring " + DbName + " on " + ServerName); 
       Database newDb = new Database(server, DbName); 

       Restore rs = new Restore(); 
       rs.NoRecovery = false; 
       FileInfo fi = new FileInfo(server.Settings.BackupDirectory + "\\" + BackupFileName); 
       BackupDeviceItem bdi = new BackupDeviceItem(fi.FullName, DeviceType.File); 
       rs.Devices.Add(bdi); 
       rs.Database = DbName; 
       rs.Action = RestoreActionType.Database; 

       rs.SqlRestore(server); 
       Log.LogMessage(MessageImportance.High, "Restoring done."); 
      } 
      catch(Exception exc) 
      { 
       Log.LogErrorFromException(exc); 
      } 
      return !Log.HasLoggedErrors; 
     } 
     private string m_DbName; 
     ... 
    } 
} 

用作:

<UsingTask AssemblyFile="bin\Release\MyTask.dll" TaskName="RestoreDb" /> 
    <RestoreDb ServerName="localhost\sql2005" DbName="myDb" BackupFileName="myDb.bak"/> 

任何和所有的COM欢迎!

+0

Task对象驻留在什么库? – 2012-07-13 21:57:18

2

我使用的MSBuild扩展包MSBuild extension pack修改配置文件,创建应用程序池,甚至是发送电子邮件。

相关问题