Я использую 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 -> maxTimeout machine.config», но я получаю исключение после изменения моей конфигурации в этот файл:
<?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 = 32 бит, bigint = 64 бит). Мне нужно создать новые таблицы и вставить данные из старой таблицы в новую таблицу с int64.Таблица, связанная идентификатором с другими 4 таблицами, каждая из которых содержит более 20 миллионов строк, а также привязку,индексацию и многое другое.Я не могу разделить эту процедуру на небольшую хранимую процедуру, поэтому мне нужно изменить максимальное время ожидания на один час или более, 10 минут недостаточно!).