SQL Server SMO - 备份 - 如何确定失败/成功?

2024-01-20

如果使用 SMO 执行备份,成功完成后,我测试 SqlError 是否为 null,认为备份已完成且没有错误:

但是,正如您所看到的,它实际上返回了 0 类编号 3014 的错误,这意味着成功。

所以问题是:

问:如何确定备份是否成功完成,以及如何干净地处理这些消息和状态?

我担心这里有多个“陷阱”,当这段代码投入生产时,我不想再惹麻烦了:)


我同意存在多个“陷阱”,并且我个人认为 Microsoft SMO 事件实施得很差,因为 ServerMessageEventArgs 包含一个属性错误,它并不总是提供有关错误的信息,而是提供有关成功操作的消息!

举个例子: 代码 4035 的“错误”是一条信息消息。不是错误。 代码 3014 的“错误”是成功完成时出现的信息消息。不是错误

另请注意,发生错误时,信息事件并不总是发生。实际上,每当 SQL Server 发送一条可能是有关已成功完成的操作的信息的消息时,就会发生这种情况

我还担心没有正确处理错误/成功,但是检查 sqlError 为 Null 是一个坏主意因为它永远不会为空,并且它将始终包含一些有关成功操作或错误的消息。和假设发生错误时发生信息事件也是一个坏主意.

我建议通过 SqlError.Number 并根据已触发的 SMO 事件来处理错误。

我编写了以下代码来创建数据库备份。它在 VB.NET 中,但在 C# 中会类似。它接收必要的参数,包括调用事件的委托(在 GUI 上处理)、报告百分比的进度和根据事件触发的错误处理以及如上所述的 SqlError.Number

Public Sub BackupDatabase(databaseName As String, backupFileFullPath As String, optionsBackup As OptionsBackupDatabase, operationProgress As IProgress(Of Integer),
                          operationResult As Action(Of OperationResult)) Implements IDatabaseManager.BackupDatabase
    Dim sqlBackup As New Smo.Backup()
    sqlBackup.Action = Smo.BackupActionType.Database
    sqlBackup.BackupSetName = databaseName & " Backup"
    sqlBackup.BackupSetDescription = "Full Backup of " & databaseName
    sqlBackup.Database = databaseName
    Dim bkDevice As New Smo.BackupDeviceItem(backupFileFullPath, Smo.DeviceType.File)
    sqlBackup.Devices.Add(bkDevice)
    sqlBackup.Initialize = optionsBackup.Overwrite
    sqlBackup.Initialize = True
    sqlBackup.PercentCompleteNotification = 5

    AddHandler sqlBackup.PercentComplete, Sub(sender As Object, e As PercentCompleteEventArgs)
                                              operationProgress.Report(e.Percent)
                                          End Sub
    AddHandler sqlBackup.Complete, Sub(sender As Object, e As ServerMessageEventArgs)
                                       Dim sqlMessage As SqlClient.SqlError = e.Error
                                       Dim opResult As New OperationResult()
                                       Select Case sqlMessage.Number
                                           Case 3014
                                               opResult.operationResultType = OperationResultType.SmoSuccess
                                               opResult.message = "Backup successfully created at " & backupFileFullPath & ". " & sqlMessage.Number & ": " & sqlMessage.Message
                                           Case Else
                                               opResult.operationResultType = OperationResultType.SmoError
                                               opResult.message = "ERROR CODE " & sqlMessage.Number & ": " & sqlMessage.Message
                                       End Select
                                       operationResult.Invoke(opResult)
                                   End Sub

    AddHandler sqlBackup.NextMedia, Sub(sender As Object, e As ServerMessageEventArgs)
                                        Dim sqlMessage As SqlClient.SqlError = e.Error
                                        Dim opResult As New OperationResult()
                                        opResult.operationResultType = OperationResultType.SmoError
                                        opResult.message = "ERROR CODE:  " & sqlMessage.Number & ": " & sqlMessage.Message
                                        operationResult.Invoke(opResult)
                                    End Sub

    AddHandler sqlBackup.Information, Sub(sender As Object, e As ServerMessageEventArgs)
                                          Dim sqlMessage As SqlClient.SqlError = e.Error
                                          Dim opResult As New OperationResult()
                                          Select Case sqlMessage.Number
                                              Case 4035
                                                  opResult.operationResultType = OperationResultType.SmoInformation
                                                  opResult.message = sqlMessage.Number & ": " & sqlMessage.Message
                                              Case Else
                                                  opResult.operationResultType = OperationResultType.SmoError
                                                  opResult.message = "ERROR CODE " & sqlMessage.Number & ": " & sqlMessage.Message
                                          End Select
                                          operationResult.Invoke(opResult)
                                      End Sub
    Try
        sqlBackup.SqlBackupAsync(smoServer)
    Catch ex As Exception
        Throw New BackupManagerException("Error backing up database " & databaseName, ex)
    End Try
End Sub
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL Server SMO - 备份 - 如何确定失败/成功? 的相关文章

  • 链接 .Net 程序集

    这都是假设 所以请耐心等待 假设我正在用 C 编写一个名为 Foo 的工具 输出是 foo exe 我发现了一些我喜欢使用的非常棒的库 称为 Bar 我可以在我的项目中将其引用为 bar dll 当我构建项目时 我的输出目录中有 foo e
  • 2个对象,完全相同(除了命名空间)c#

    我正在使用第三方的一组网络服务 但遇到了一个小障碍 在我手动创建将每个属性从源复制到目标的方法之前 我想我应该在这里寻求更好的解决方案 我有 2 个对象 一个是 Customer CustomerParty 类型 另一个是 Appointm
  • MVC 5 中具有 ASP.NET Identity 的 Autofac 不会验证 OWIN 管道中的安全标记

    我在 MVC 5 中设置了 AutoFac 来与 ASP NET Identity 一起使用 表面上一切似乎都工作正常 即用户可以创建帐户并登录 但后来我发现 当安全标记更改时 用户不会注销 通过在 AspNetUsers 表中进行暴力破解
  • 用于在标头更改时重新编译的简单 C 项目的示例 makefile

    有谁有完整的 makefile 可以执行以下操作 如果 HEADER 文件发生更改 则重建项目 cpp 文件在 makefile 中列出 头文件未在 makefile 中列出 头文件允许与 cpp 文件具有不同的名称 部分cpp文件没有头文
  • 如何安全地使用保留的 SQL 名称?

    我正在使用 Cakephp 3 使用 sqlserver 作为数据源服务器 我确信我的数据库连接没有问题 因为 home ctp 提示我已连接到我的数据库 并且我还使用迁移插件来创建我的表 似乎使用它没有问题这些工具 但是在我烘焙 MVC
  • SSRS ReportViewer 与 XML 嵌入数据源相关的问题

    我有 C WPF 应用程序 我想在 ReportViewer 控件中显示 SSRS 报告 本地报告文件中嵌入了 XML 数据源 从 SQL Server Business Intelligence Development Studio 运行
  • 在 SQL Server 中获取一周的第一天

    我试图按周对记录进行分组 将聚合日期存储为一周的第一天 然而 我用于四舍五入日期的标准技术似乎无法在几周内正常工作 尽管它可以在天 月 年 季度和我应用的任何其他时间范围内正常工作 这是 SQL select start of week d
  • 调整屏幕和字体设置的 WPF 应用程序(或者,我如何将 DLU 与 WPF 中的单元相关联?)

    在MFC中 对话框的设计使用DLUs http msdn microsoft com en us library bb847924 aspx 在 WPF 中 我们以 1 96 英寸为单位指定 虽然这确实会缩放窗口和视觉元素 但我们如何使 W
  • 如何对使用 Controller.User 变量的控制器操作进行单元测试?

    我有一个控制器操作 如果用户已经登录 它会自动重定向到新页面 User Identity IsAuthenticated 针对这种情况编写单元测试以确保重定向发生的最佳方法是什么 我一直在使用以下 Mocks 和 Moq 来允许在我的单元测
  • 让网络摄像头在 OpenCV 中工作

    我正在尝试让我的网络摄像头在 Windows 7 64 位中的 OpenCV 版本 2 2 中捕获视频 但是 我遇到了一些困难 OpenCV 附带的示例二进制文件都无法检测到我的网络摄像头 最近我发现这篇文章表明答案在于重新编译一个文件 o
  • MySQL 连接器 C++ 64 位在 Visual Studio 2012 中从源代码构建

    我正在尝试建立mySQL 连接器 C 从源头在视觉工作室2012为了64 bit建筑学 我知道这取决于一些boost头文件和C 连接器 跑步CMake生成一个项目文件 但该项目文件无法编译 因为有一大堆非常令人困惑的错误 这些错误可能与包含
  • SQLAPI++ 的免费替代品? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有任何免费 也许是开源 的替代品SQLAPI http www sqlapi com 这个库看起来
  • .NET 和 Mono 之间的开发差异

    我正在研究 Mono 和 NET C 将来当项目开发时我们需要在 Linux 服务器上运行代码 此时我一直在研究 ASP NET MVC 和 Mono 我运行 Ubuntu 发行版 想要开发 Web 应用程序 其他一些开发人员使用 Wind
  • 以编程方式创建 Blob 存储容器

    我有一个要求 即在创建公司时 在我的 storageaccount 中创建关联的 blob 存储容器 并将容器名称设置为传入的字符串变量 我已尝试以下操作 public void AddCompanyStorage string subDo
  • 如何重置 SQL Server 中表的 IDENTITY 列? [复制]

    这个问题在这里已经有答案了 我怎样才能重置我的IDENTITY我已经填充的表中的列 我尝试过类似的方法 但它不起作用 WITH TBL AS SELECT ROW NUMBER OVER ORDER BY profile id AS RN
  • C++ 指针引用混淆

    struct leaf int data leaf l leaf r struct leaf p void tree findparent int n int found leaf parent 这是 BST 的一段代码 我想问一下 为什么
  • 如何编写一个接受 int 或 float 的 C 函数?

    我想用 C 语言创建一个扩展 Python 的函数 该函数可以接受 float 或 int 类型的输入 所以基本上 我想要f 5 and f 5 5 成为可接受的输入 我认为我不能使用if PyArg ParseTuple args i v
  • 从后面的代码添加外部 css 文件

    我有一个 CSS 文件 例如 SomeStyle css 我是否可以将此样式表文档从其代码隐藏应用到 aspx 页面 您可以将文字控件添加到标头控件中 Page Header Controls Add new System Web UI L
  • 如果找不到指定的图像文件,显示默认图像的最佳方式?

    我有一个普通的电子商务应用程序 我将 ITEM IMAGE NAME 存储在数据库中 有时经理会拼错图像名称 为了避免 丢失图像 IE 中的红色 X 每次显示产品列表时 我都会检查服务器中是否有与该产品相关的图像 如果该文件不存在 我会将其
  • 嵌入式linux编写AT命令

    我在向 GSM 模块写入 AT 命令时遇到问题 当我使用 minicom b 115200 D dev ttySP0 term vt100 时它工作完美 但我不知道如何在 C 代码中做同样的事情 我没有收到任何错误 但模块对命令没有反应 有

随机推荐

  • 自定义默认“新存储过程”SSMS 2008 模板

    我正在尝试自定义您单击时放置的默认查询New Stored Procedure 来自Object Explorer在 SQL Server Management Studio 2008 上 我找到了如何更改 创建存储过程 新菜单 模板Tem
  • 如何使用休眠查询仅获取具有关联的实体的某些字段?

    我有一个具有多个字段的实体 其中一些是关联 假设该实体具有与以下类似的结构 Entity Table name foos public class Foo public Foo Id private Long id Column priva
  • W/AudioGroup:设备循环超时

    我正在尝试在我的 android 中进行 SIP 呼叫 第一次通话时声音效果很好 但是当此通话结束并开始第二次通话时 声音被中断 并且我收到以下警告 每秒多行 W AudioGroup 设备循环超时 我以以下方式开始通话 mSipManag
  • Apache Spark GCS 连接器的速率限制

    我在带有 Google Cloud Storage 连接器的 Google Compute Engine 集群上使用 Spark 而不是 HDFS 如受到推崇的 https cloud google com hadoop google cl
  • 更好的方法来检查条件而不是重复 Case When

    这是我的表格 Member Id UserId UserName Email Status Id MemberType Id CustomerProfile Id Member Id FirstName LastName SSN Gende
  • 提升灵气期待

    我对灵气比较陌生 正在尝试解析一种类似汇编语言 例如 我想解析 Func Ident Mov name hello Push 5 Exit 到目前为止 一切都很好 我可以正确解析它 然而 错误处理程序有时会出现奇怪的错误位置 以下面的错误代
  • Laravel 模板/控制器在保存时未更新

    我正在 OS X 上运行 Laravel 4 作为一个简单的应用程序 基本上 在我保存对这些文件的更改后 对控制器和模板的更改在很长一段时间内不会生效 例如 我向 app views index blade php 添加一个单词 并且在不断
  • javascript bookmarklet 隐藏当前网页中的所有图像?

    我想创建一个简单的书签 隐藏我正在浏览的当前网站的所有图像 javascript body getElementsByTagName img style visibility hidden 那不行吗 我想知道我做错了什么 感谢您的帮助 您需
  • 当应用程序长时间进入后台时,Firestore 监听器被杀死

    在我的应用程序中 每当用户登录时 我都会监听 Firestore 查询 应用程序进入后台一段时间后 监听器将被取消 并且客户端不会收到任何新更改的通知 如何知道监听器是否已被 SDK 取消 处理这个问题的正确方法是什么 在大多数操作系统上
  • 在生产服务器中拥有 Git 存储库是一个坏主意吗

    我们有 Windows Server 2012 Apache PHP 和 MySQL 服务器有点乱 我想要的事情之一是跟踪代码的更改 通常我不会在服务器上设置 Git 而是在本地计算机上进行开发 然后使用 SSH 将更改部署到生产服务器 然
  • 在 WPF 中使用枚举作为依赖属性

    我尝试在自定义控件中使用枚举类型作为依赖属性 但总是收到错误 public enum PriceCategories First 1 Second 2 Third 3 Fourth 4 Fifth 5 Sixth 6 public stat
  • Blackberry Storm 模拟器 - TouchGesture 事件未触发,如何让滑动功能正常工作?

    我一直在玩 Storm Emulator 和 4 7 JDE 我一生都不知道如何在模拟器中触发手势事件 下面是 RIM 示例应用程序 EmbeddedMapDemo 的触摸事件代码 这看起来很简单 但 touchGesture getEve
  • 是否可以使用一个重载运算符来实现另一个运算符重载?

    例如 如果我重载了 运算符 myClass operator const myClass rhs 并且还重载了 运算符 myClass operator const myClass rhs 两个运营商都工作正常 我可以在 运算符重载中使用这
  • asp.net mvc 中数据库上下文类的用途是什么

    我是 MVC 新手 并且已经完成了一些教程来掌握它的窍门 但在其中一些教程中我遇到了一个带有 DbContext 类的示例asp net mvc5 与 EF6 教程 https www asp net mvc overview gettin
  • 使用 i18n 进行 Vuelidate:在区域设置消息中找不到密钥

    因此 在我的 i18n validators js 文件中 我想将带有翻译消息的验证器导出为我选择的语言 并在我的 vue 组件中使用它们来验证表单 My code import as VuelidateValidators from ht
  • C# 读取xml文件

    我正在尝试拉
  • 如何绑定内联匿名函数?

    我在尝试着bind ie bind this 内联匿名回调函数object如何做呢 简化示例 var object property function this id abc this binds to the object aFuncti
  • D3:使用 d3.max 获取包含对象?

    我有以下数据 一个对象数组 var data x 0 y0 0 y 100 x 1 y0 0 y 150 x 2 y0 50 y 100 x 3 y0 50 y 150 我想找到之间差异最大的对象y and y0 使用 D3 我可以这样做以
  • Netbeans 中的拆分窗口

    我正在尝试拆分我的窗口 以便我可以在 1 个屏幕上拥有 2 个不同的类或其他内容 但它只会拆分同一类 文件 其他内容的窗口 我已经使用 netbeans 多年了 但仍然无法做到这一点 这可能吗 您没有具体提及您正在使用哪个版本的 NetBe
  • SQL Server SMO - 备份 - 如何确定失败/成功?

    如果使用 SMO 执行备份 成功完成后 我测试 SqlError 是否为 null 认为备份已完成且没有错误 但是 正如您所看到的 它实际上返回了 0 类编号 3014 的错误 这意味着成功 所以问题是 问 如何确定备份是否成功完成 以及如