我正在开发一个网站,它使用SQL Server 2008 R2 Express作为其数据库。在测试中,有很多数据和图像存储在这个数据库中。
According to wiki, the SQL Server Express edition has a 10 GB size limit.当我插入数据并达到限制时,会抛出什么异常?或者,如何通过代码检测接近限制问题?
我使用EF 5代码优先方法插入大数据集。
答案 0 :(得分:5)
在测试中我看到了:
sp_spaceused
将无法按预期工作,在删除大量记录后显示12GB。关于查询sys.databases的其他答案对我来说还不够清楚。
我在Ramons weblog找到了关于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
“... space包含事务日志,它还包括这些文件中所有未使用的空间....当SQL Server Express无法为数据文件保留更多空间时,它将开始抱怨。”
所以检查
CAST(FILEPROPERTY([name],'SpaceUsed') AS int)/128.0 AS [UsedSpaceInMB]
似乎是最好的选择。
结合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;
答案 1 :(得分:1)
检查数据库大小查询:
sys.databases
只需使用C#查询此信息,或者如果您使用SSMS(sql server management studio)shell,您就可以安排通过电子邮件发送给您的工作或任何您想要的工作。
实施例: SQL Server 2008: How to query all databases sizes?
编辑:不确定是否抛出错误,它应该记录到事件日志或sql日志......
旁注: 开发人员版本仅为50美元,与Datacenter相同,持有524 PB http://technet.microsoft.com/en-us/library/cc645993%28v=sql.105%29.aspx
答案 2 :(得分:1)
以两种方式检查数据库的大小:
/ *新的学校方式 - 数据加上日志并在您想要查看的本地数据库中运行 在这里你可以看到日志和mdf文件。 * / SELECT size * 8.0 / 1024.0 as size_in_gb,* FROM sys.database_files GO
/ *旧学校方式,运行所有数据库大小* / 的sp_helpdb
仅供参考 - MDF和NDF文件是唯一归因于文件大小超过10GB的文件。
答案 3 :(得分:1)
执行此SQL命令,它将显示当前数据库的磁盘空间使用情况。
sp_spaceused
它还可用于查询特定表的空间使用情况。 This link provides useful information about this problem.
答案 4 :(得分:1)
我使用以下方法计算数据库当前大小,这对于与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());
}
}
)