来自 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)
);
我正在尝试使用 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)
);