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