每次在使用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();
}
}
}
答案 0 :(得分:0)
您可以尝试在连接上启用MARS(msdn关于MARS) 在连接字符串中应该是:“MultipleActiveResultSets = true;”
答案 1 :(得分:0)
如Anders UP所述,结果是NoLogTruncation正在影响它。