7

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

根据 wiki,SQL Server Express 版本的大小限制为10 GB 。当我插入数据并达到限制时,会抛出什么异常?或者,如何通过代码检测接近极限问题?

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

4

5 回答 5

15

在测试中我看到:

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]

似乎是最好的选择。

结合中的 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;
于 2014-03-20T14:40:10.037 回答
2

执行此 SQL 命令,它将显示当前数据库的磁盘空间使用情况。

sp_spaceused

它也可以用来查询特定表的空间使用情况。此链接提供有关此问题的有用信息。

于 2013-11-14T07:29:12.263 回答
1

检查数据库大小的两种方法:

/* 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 的文件。

于 2013-11-10T17:18:58.980 回答
1

检查数据库大小查询

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 相同

于 2013-11-08T07:14:50.707 回答
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());
            }
        }

)

于 2016-09-07T20:49:52.893 回答