2012-01-12 57 views
2

運行SQL Server備份後創建的事務我一直在每次收到以下錯誤我試圖創建一個新的事務我已經備份了使用SMO我的數據庫後(SQL Server管理對象):例外通過SMO

新事務不被允許,因爲會話中還有其他線程正在運行。

我已經創建了一個演示該問題的一個小控制檯應用程序:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using Microsoft.SqlServer.Management.Smo; 
using System.Data.SqlClient; 
using System.Data; 

namespace TestSMO 
{ 
    class Program 
    { 
     string username = "radandba"; 
     string password = "belmont"; 
     string servername = "e2idev\\e2isqlexpress"; 
     string databaseName = "e2i"; 
     string backupfilename = "c:\\e2i.bak"; 
     Server server; 

     static void Main(string[] args) 
     { 
      Program prog = new Program(); 
      prog.server = new Server(prog.servername); 
      prog.server.ConnectionContext.LoginSecure = false; 
      prog.server.ConnectionContext.Password = prog.password; 
      prog.server.ConnectionContext.Login = prog.username; 

      try 
      { 
       prog.server.ConnectionContext.Connect(); 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine(ex.Message); 
       Console.ReadLine(); 
       return; 
      } 

      Console.WriteLine("Connected"); 
      //prog.SelectData(); 

      Backup backup = new Backup(); 
      backup.Action = BackupActionType.Database; 
      backup.Database = prog.databaseName; 
      backup.Devices.Clear(); 
      backup.Incremental = false; 
      backup.Devices.AddDevice(prog.backupfilename, DeviceType.File); 
      backup.BackupSetName = prog.databaseName + " database backup"; 
      backup.BackupSetDescription = prog.databaseName + " database - Full backup"; 
      backup.Initialize = true; 
      backup.CopyOnly = true; 
      backup.LogTruncation = BackupTruncateLogType.NoTruncate; 
      backup.CompressionOption = BackupCompressionOptions.Default; 

      backup.Complete += new Microsoft.SqlServer.Management.Common.ServerMessageEventHandler(prog.backup_Complete); 
      backup.Information += new Microsoft.SqlServer.Management.Common.ServerMessageEventHandler(prog.backup_Information); 
      backup.PercentComplete += new PercentCompleteEventHandler(prog.backup_PercentComplete); 
      backup.SqlBackupAsync(prog.server); 
     } 

     void backup_PercentComplete(object sender, PercentCompleteEventArgs e) 
     { 
      Console.WriteLine("Backup progress: " + e.Percent); 
     } 

     void backup_Information(object sender, Microsoft.SqlServer.Management.Common.ServerMessageEventArgs e) 
     { 
      Console.WriteLine("Backup status: No:" + e.Error.Number + " Detail: " + e.Error.Message); 
     } 

     void backup_Complete(object sender, Microsoft.SqlServer.Management.Common.ServerMessageEventArgs e) 
     { 
      Console.WriteLine("Backup status: No:" + e.Error.Number + " Detail: " + e.Error.Message); 

      SelectData(); 
     } 

     public void SelectData() 
     { 
      SqlConnection sqlCon = server.ConnectionContext.SqlConnectionObject; 

      try 
      { 
       if (sqlCon.State != System.Data.ConnectionState.Open) 
        sqlCon.Open(); 

       SqlTransaction trans = sqlCon.BeginTransaction(); 
       SqlDataAdapter adapter = new SqlDataAdapter("select * from version", sqlCon); 
       adapter.SelectCommand.Transaction = trans; 
       DataTable dt = new DataTable(); 
       adapter.Fill(dt); 
       foreach (DataRow row in dt.Rows) 
       { 
        Console.WriteLine(row[0]); 
       } 
       trans.Commit(); 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine(ex.Message); 
      } 
      finally 
      { 
       sqlCon.Close(); 
      } 
      Console.ReadLine(); 
     } 
    } 
} 
+0

嗯,沒有答案。那麼必須是SMO中的一個bug。 – rawajames 2012-01-17 12:08:33

+0

你有沒有嘗試讓選擇等待一段時間?快速搜索沒有透露信息來證實我的預感,但我猜你的NoLogTruncation正在影響這一點。你可以嘗試給它一兩分鐘,看看是否改變你的結果?如果有的話,會有一些工作要做。 – 2012-01-23 10:31:53

+0

乾杯,更改了截斷日誌的代碼,它工作正常。我在某處看到了爲什麼不截斷日誌的原因。如果你只是想要一個只有複製的備份,那就行了。 – rawajames 2012-02-14 11:08:59

回答

0

正如Anders UP所述,NoLogTruncation正在影響它。

0

你可以嘗試對連接(msdn約MARS) 在連接字符串使MARS應該是:「MultipleActiveResultSets = TRUE;」