0

我正在开发一个使用 Sqlserver 2005 数据库的小型企业应用程序。

平台:.Net framework 3.5;应用类型:windows应用;语言:C#

问题:

我需要从我的应用程序中获取并恢复备份。我有从 SSME 生成的所需脚本。

如何从我的 winform 应用程序运行该特定脚本(或多个脚本)?

4

5 回答 5

1

您可以像运行查询一样运行这些脚本,只是您不连接到要恢复的数据库,而是连接到 master。

于 2009-01-10T14:37:00.193 回答
0

如果运行应用程序的计算机安装了 SQL Server 客户端工具,则可以使用sqlcmd

于 2009-01-10T14:37:46.167 回答
0

如果您想以编程方式执行此操作,您可以使用SMO

教程

于 2009-01-10T14:46:48.830 回答
0

只需使用与数据库的连接(我猜是 ADO 吗?)并通过此连接将纯 TSQL 指令发送到服务器。

于 2009-01-10T15:04:53.443 回答
0

对于备份,您可能想要使用 xp_sqlmaint。它具有删除旧备份的便捷功能,并创建了一个不错的日志文件。您可以通过以下方式调用它: EXECUTE master.dbo.xp_sqlmaint N''-S "[ServerName]" [ServerLogonDetails] -D [DatabaseName] -Rpt "[BackupArchive]\BackupLog.txt" [RptExpirationSchedule] -CkDB -BkUpDB “[BackupArchive]”-BkUpMedia DISK [BakExpirationSchedule]''

(用合适的值替换 [方括号])。

此外,对于备份,您可能需要备份事务日志。类似于: IF DATABASEPROPERTYEX((SELECT db_name(dbid) FROM master..sysprocesses WHERE spid=@@SPID), ''Recovery'') <> ''SIMPLE'' EXECUTE master.dbo.xp_sqlmaint N'' -S " [ServerName]" [ServerLogonDetails] -D [DatabaseName] -Rpt "[BackupArchive]\BackupLog_TRN.txt" [RptExpirationSchedule] -BkUpLog "[BackupArchive]" -BkExt TRN -BkUpMedia DISK [BakExpirationSchedule]''

我建议将您正在使用的实际命令存储在数据库表中(每个命令 1 行),并使用某种模板替换方案来处理可配置的值。这将允许轻松更改命令,而无需部署新代码。

对于还原,您需要终止除内部 sql server 之外的所有连接。基本上取“exec sp_who”的结果和与 dbname 匹配的行,并且状态不是“background”,并且 cmd 不是“SIGNAL HANDLER”、“LOCK MONITOR”、“LAZY WRITER”之一、“LOG WRITER”、“CHECKPOINT SLEEP”对 spid 执行“kill”(例如:ExecuteNonQuery("kill 1283"))。

您需要捕获并忽略来自 KILL 命令的任何异常。你对他们无能为力。如果由于现有连接而无法进行还原,则会引发错误。

终止连接的一个危险是 ADO 的连接池(对于 asp.net 应用程序比 windows 应用程序更多)。ADO 假定从连接池中获取的连接是有效的......并且它对已被终止的连接反应不佳。在该连接上发生的下一个操作将失败。我不记得该错误...您也许可以捕获该特定错误并对其进行处理...也可以使用 3.5 我认为您可以刷新连接池(所以...捕获错误,刷新连接池,打开连接,再次尝试该命令...丑陋但可能可行)。

于 2009-01-11T01:46:53.333 回答