来自 C# 代码的 C# localdb SHRINKDATABASE 命令

C# localdb SHRINKDATABASE command from C# code

我正在尝试使用 Visual Studio 2017 社区缩小 LocalDb。我有一个 Win7 客户端 windows 表单应用程序,它带有一个小型数据库(~10MB 的数据),由于 LocalDb 免费 space 分配,导致数据库大小为 150MB。

我找到了建议使用以下代码的答案 (Executing Shrink on SQL Server database using command from linq-to-sql):

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

DatabaseTools.Instance.DatabasePathName returns 来自单例 DatabaseTools class 实例的我的数据库的文件系统位置。

代码运行,但我不断收到此异常:

System.Data.SqlClient.SqlException: 'Cannot perform a shrinkdatabase operation inside a user transaction. Terminate the transaction and reissue the statement.'

我之前尝试过COMMIT,但完全没有成功。关于如何有效地从 C# 代码收缩数据库的任何想法? 谢谢!

正如 ExecuteSqlCommand 的文档所说,"If there isn't an existing local or ambient transaction a new transaction will be used to execute the command."

这就是导致您出现问题的原因,因为您无法在事务中调用 DBCC SHRINKDATABASE。考虑到它的作用,这并不奇怪。

使用the overload that allows you to pass a TransactionalBehavior并指定TransactionalBehavior.DoNotEnsureTransaction:

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