通过SMO运行sql server备份后创建事务的异常

时间:2012-01-12 13:14:39

标签: sql sql-server sql-server-2008 sql-server-2005 smo

每次在使用SMO(Sql Server管理对象)备份数据库后尝试创建新事务时,我都会继续收到以下错误:

不允许新事务,因为会话中还有其他线程在运行。

我创建了一个演示此问题的小控制台应用程序:

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 :(得分:0)

您可以尝试在连接上启用MARS(msdn关于MARS) 在连接字符串中应该是:“MultipleActiveResultSets = true;”

答案 1 :(得分:0)

如Anders UP所述,结果是NoLogTruncation正在影响它。