Я использую TransactionScope в этом коде:
private void ExecuteSP()
{
bool IsComplete = false;
SqlCommand sqlComm = null;
//6 hours!!!
TimeSpan ts1 = new TimeSpan(6, 0, 0);
try
{
using (TransactionScope t = new TransactionScope(TransactionScopeOption.RequiresNew, ts1))
{
using (SqlConnection sqlConn = new SqlConnection(GetConnectionString()))
{
//open sql connection
sqlConn.Open();
try
{
//create new sqlCommand
sqlComm = new SqlCommand();
for (int i = 1; i <= 2; i++)
{
IsComplete = true;
//This command takes 15 minutes
sqlComm.CommandText = "exec TestSp";
sqlComm.Connection = sqlConn;
sqlComm.CommandType = CommandType.Text;
sqlComm.CommandTimeout = 18000;
//Executing my command
int j = sqlComm.ExecuteNonQuery();
}
//End
t.Complete();
}
catch (Exception ex)
{
IsComplete = false;
string Message = ex.Message;
}
finally
{
if (sqlComm != null)
sqlComm.Dispose();
}
}
}
}
catch (Exception ex)
{
string messagee = ex.Message;
//do something
}
finally
{
MessageBox.Show("Finsh");
}
}
Это происходит после одного выполнения (sqlCommand.ExecuteNonQuery ();), выполнение которого занимает более 10 минут. Я не получаю никаких исключений в этом пункте, в следующем исключении я получаю это исключение:
The transaction associated with the current connection has completed but has not been disposed. The transaction must be disposed before the connection can be used to execute SQL statements.
Это потому, что для System.Transactions.TransactionManager.MaximumTimeout установлено значение TimeSpan, равное 10 минутам.
Я ищу, и я обнаружил, что, возможно, это связано с "System.Transactions -> machine.config's maxTimeout", но я получаю исключение после изменения моей конфигурации на этот файл:
<?xml version="1.0"?>
<configuration>
<system.transactions>
<machineSettings maxTimeout="10:00:00"/>
</system.transactions>
<appSettings>
<add key="FileName" value="MyFileName" />
<add key="MySpace" value="5 MB" />
<add key="ClientSettingsProvider.ServiceUri" value="" />
</appSettings>
</configuration>
когда я пытаюсь получить System.Transactions.TransactionManager.MaximumTimeout во время выполнения после того, как я изменил файл конфигурации, я получаю это исключение:
«Не удалось инициализировать систему конфигурации»
Кто-нибудь знает, как решить эту проблему?
(Общее примечание о моем случае:
мне нужно сделать хранимую процедуру, которая занимает около 20 минут, потому что мне нужно преобразовать таблицу, содержащую int в bigint в SQL (int = 32bit, bigint = 64 bit). Мне нужно создать новые таблицы и вставить данные из старой таблицы в новую таблицу с int64. Таблица, связанная по идентификатору с четырьмя другими таблицами, каждая из которых содержит более 20 миллионов строк, а также привязку, индексацию и многое другое. Я не могу разделить эту процедуру на небольшую хранимую процедуру, поэтому мне нужно изменить максимальное время ожидания на один час или более, 10 минут недостаточно!).