我正在开发一个网站,它使用 SQL Server 2008 R2 Express 作为其数据库。并且在测试中,有很多数据和图像存储在这个数据库中。
根据 wiki,SQL Server Express 版本的大小限制为10 GB 。当我插入数据并达到限制时,会抛出什么异常?或者,如何通过代码检测接近极限问题?
我使用 EF 5 和代码优先方法来插入大型数据集。
我正在开发一个网站,它使用 SQL Server 2008 R2 Express 作为其数据库。并且在测试中,有很多数据和图像存储在这个数据库中。
根据 wiki,SQL Server Express 版本的大小限制为10 GB 。当我插入数据并达到限制时,会抛出什么异常?或者,如何通过代码检测接近极限问题?
我使用 EF 5 和代码优先方法来插入大型数据集。
在测试中我看到:
sp_spaceused
无法按预期工作,删除大量记录后显示 12GB。关于查询 sys.databases 的其他答案对我来说还不够清楚。
环顾四周,我在Ramons 博客上找到了关于 SQL Server 2012 Express Edition 10GB 大小限制的很好解释[EDIT2018 更新链接]
SELECT
[name] AS [Filename],
[size]/128.0 AS [Filesize],
CAST(FILEPROPERTY([name],'SpaceUsed') AS int)/128.0 AS [UsedSpaceInMB],
[size]/128.0 - CAST(FILEPROPERTY([name],'SpaceUsed') AS int)/128.0 AS [AvailableSpaceInMB],
[physical_name] AS [Path]
FROM sys.database_files
“......空间包括事务日志,还包括这些文件中所有未使用的空间......当 SQL Server Express 无法为数据文件保留更多空间时,它将开始抱怨。”
所以检查
CAST(FILEPROPERTY([name],'SpaceUsed') AS int)/128.0 AS [UsedSpaceInMB]
似乎是最好的选择。
结合c#中的 EF,我对数据库的请求看起来像
string sqlSelect = "SELECT CAST(FILEPROPERTY([name],'SpaceUsed') AS int)/128.0 AS [UsedSpaceInMB] FROM sys.database_files";
var dbResult = dbInstance.Database.SqlQuery<Decimal>(sqlSelect).FirstOrDefault();
double spaceUsedInGb = Convert.ToDouble(dbResult)/1024;
检查数据库大小的两种方法:
/* new school way - data plus log and run in the local db that you want to see here你可以看到日志和mdf文件。*/ SELECT size*8.0/1024.0 as size_in_gb, * FROM sys.database_files GO
/* 老式方法,运行所有 db 大小*/ sp_helpdb
仅供参考 - MDF 和 NDF 文件是唯一的文件大小超过 10GB 的文件。
检查数据库大小查询:
sys.databases
只需查询这个,也许使用 C# 或者如果您使用 SSMS(sql server management studio)shell,您可以安排一个通过电子邮件发送给您的作业或任何您想要的作业。
示例: SQL Server 2008:如何查询所有数据库大小?
编辑:不确定是否抛出错误,它应该记录到事件日志或 sql 日志...
旁注:开发版只需 50 美元,与拥有 524 PB http://technet.microsoft.com/en-us/library/cc645993%28v=sql.105%29.aspx的 Datacenter 相同
我正在使用以下方法来计算数据库当前大小,这对于与 sql 大小限制进行比较至关重要:
public static int GetDbSizeInMB([NotNull] string connectionString) {
using (SqlConnection sqlConnection = new SqlConnection(connectionString)) {
sqlConnection.Open();
using (var sqlCommand = new SqlCommand()) {
sqlCommand.CommandType = CommandType.Text;
sqlCommand.CommandText = @"
SELECT SUM(CAST(FILEPROPERTY([name],'SpaceUsed') AS int)/128.0) AS [UsedSpaceInMB]
FROM sys.database_files
WHERE type_desc like 'ROWS' or type_desc like 'FULLTEXT'
";
sqlCommand.Connection = sqlConnection;
return Convert.ToInt32(sqlCommand.ExecuteScalar());
}
}
)