Команда C# localdb SHRINKDATABASE из кода C#

Я пытаюсь сжать LocalDb с помощью сообщества Visual Studio 2017. У меня есть клиентское приложение формы Windows Win7 с небольшой базой данных (~ 10 МБ данных), что приводит к размеру базы данных 150 МБ из-за выделения свободного места LocalDb.

Я нашел этот ответ (Выполнение сжатия на База данных SQL Server с использованием команды из linq-to-sql), которая предлагает использовать следующий код:

context.Database.ExecuteSqlCommand(
    "DBCC SHRINKDATABASE(@file)",
     new SqlParameter("@file", DatabaseTools.Instance.DatabasePathName)
);

DatabaseTools.Instance.DatabasePathName возвращает расположение моей базы данных в файловой системе из экземпляра одноэлементного класса DatabaseTools.

Код работает, но я продолжаю получать это исключение:

System.Data.SqlClient.SqlException: «Невозможно выполнить операцию сжатия базы данных внутри пользовательской транзакции. Прекратите транзакцию и повторите выписку».

Я пробовал COMMIT раньше, но безуспешно. Любая идея о том, как эффективно сжать базу данных из кода С#? Спасибо!


person massi    schedule 11.05.2017    source источник


Ответы (1)


Как сказано в документации для ExecuteSqlCommand, "Если существующей локальной или внешней транзакции не существует, для выполнения команды будет использована новая транзакция.".

Это то, что вызывает вашу проблему, так как вы не можете вызывать DBCC SHRINKDATABASE в транзакции. Что неудивительно, учитывая то, что он делает.

Используйте перегрузка, позволяющая передать TransactionalBehavior и указать TransactionalBehavior.DoNotEnsureTransaction:

context.Database.ExecuteSqlCommand(
    TransactionalBehavior.DoNotEnsureTransaction,
    "DBCC SHRINKDATABASE(@file)",
     new SqlParameter("@file", DatabaseTools.Instance.DatabasePathName)
);
person stuartd    schedule 11.05.2017