我正在开发一个使用Sqlserver 2005数据库的小型企业应用程序。
平台:.Net framework 3.5; 应用类型:windows应用; 语言:C#
问题:
我需要从我的应用程序中获取并恢复备份。我有从SSME生成的必需脚本。
如何从winform应用程序中运行该特定脚本(或脚本)?
答案 0 :(得分:1)
您可以像运行查询一样运行这些脚本,只是您没有连接到要还原的数据库,而是连接到master。
答案 1 :(得分:0)
如果运行应用程序的计算机安装了SQL Server客户端工具,则可以使用sqlcmd。
答案 2 :(得分:0)
答案 3 :(得分:0)
只需使用您与数据库的连接(ADO我假设?)并通过此连接将您的普通TSQL指令发送到服务器。
答案 4 :(得分: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我认为你可以刷新连接池(所以...陷阱错误,刷新连接池,打开连接,再次尝试命令......丑陋但可能是可行的。)