如何检查我的SQL Server Express数据库是否超过10 GB的大小限制?

时间:2013-11-08 06:48:14

标签: c# sql-server entity-framework entity-framework-5 sql-server-2008r2-express

我正在开发一个网站,它使用SQL Server 2008 R2 Express作为其数据库。在测试中,有很多数据和图像存储在这个数据库中。

According to wiki, the SQL Server Express edition has a 10 GB size limit.当我插入数据并达到限制时,会抛出什么异常?或者,如何通过代码检测接近限制问题?

我使用EF 5代码优先方法插入大数据集。

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());
            }
        }