Исключение при создании транзакции после запуска резервного копирования SQL Server через SMO - PullRequest
2 голосов
/ 12 января 2012

Я продолжаю получать следующую ошибку каждый раз, когда пытаюсь создать новую транзакцию после резервного копирования базы данных с помощью SMO (объекты управления сервером Sql):

Новая транзакция не разрешена, поскольку в сеансе запущены другие потоки.

Я создал небольшое консольное приложение, которое демонстрирует проблему:

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();
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 14 февраля 2012

Как заявил Андерс, оказалось, что на него влияло NoLogTruncation.

0 голосов
/ 23 января 2012

Вы можете попытаться включить MARS для соединения ( msdn о MARS). В строке соединения должно быть: "MultipleActiveResultSets = true;"

...