C#编程检测SQL数据库压缩支持及本地备份工具异常排查
问题分析与解决方案
你的问题核心很明确:本地SQL实例中sys.configurations不存在backup compression default这个配置项,导致执行检测查询后SqlDataReader没有返回任何数据,while (reader.Read())循环根本没有执行,所以sqlCmd.CommandText始终是初始的压缩检测语句,最终执行的自然不是备份命令。
这种情况通常出现在SQL Server Express版本中——Express版默认不支持备份压缩,系统也就不会创建这个配置项。
解决思路
咱们需要调整逻辑,确保无论检测查询是否返回结果,都能设置正确的备份命令:
- 先默认设置不使用压缩的备份命令(因为本地环境大概率不支持)
- 再尝试读取压缩配置,若能读到且值为1,再替换为带压缩的命令
- 用
ExecuteScalar替代SqlDataReader,更适合这种只取单个值的场景,代码更简洁
修改后的完整代码
// 先默认设置无压缩的备份命令(兜底逻辑) string backupCmd = $"BACKUP DATABASE [{connBuilder.InitialCatalog}] " + $"TO DISK = '{backupPath}' " + "WITH COPY_ONLY, NOFORMAT, NOINIT, " + $"NAME = '{backupName}', " + "SKIP, REWIND, NOUNLOAD, STATS = 10"; string compressionQuery = "SELECT VALUE FROM sys.configurations WHERE name = 'backup compression default'"; SqlCommand sqlCmd = new SqlCommand(compressionQuery, newConn); // 用ExecuteScalar读取单个值,不存在则返回null object result = sqlCmd.ExecuteScalar(); if (result != null && int.TryParse(result.ToString(), out int canCompress)) { Interface.WriteLine(canCompress.ToString()); if (canCompress == 1) { // 替换为带压缩的命令 backupCmd = $"BACKUP DATABASE [{connBuilder.InitialCatalog}] " + $"TO DISK = '{backupPath}' " + "WITH COPY_ONLY, COMPRESSION, NOFORMAT, NOINIT, " + $"NAME = '{backupName}', " + "SKIP, REWIND, NOUNLOAD, STATS = 10"; Interface.WriteLine("1"); } else { Interface.WriteLine("0"); } } else { // 无返回值或解析失败,使用默认的无压缩命令 Interface.WriteLine("本地环境不支持压缩检测,使用无压缩备份"); } // 更新命令文本并执行备份 sqlCmd.CommandText = backupCmd; Interface.WriteLine(sqlCmd.CommandText.ToString()); sqlCmd.ExecuteNonQuery();
关键改动说明
- 兜底逻辑前置:先定义好无压缩的备份命令,避免因检测失败导致命令未被设置
- 使用
ExecuteScalar:更高效地获取单个值,无需处理SqlDataReader的循环和关闭,不存在数据时直接返回null - 增加值解析校验:用
int.TryParse避免类型转换异常,鲁棒性更强 - 明确分支处理:专门处理无返回值的情况,清晰告知本地环境的状态
这样修改后,无论本地还是正式服务器,都能正确设置对应的备份命令,不会再出现执行检测语句的问题。
内容的提问来源于stack exchange,提问作者Red Rabbit
相关产品推荐
相关产品推荐

