2009-01-10 14 views
0

我正在开发一个使用Sqlserver 2005数据库的小型企业应用程序。如何从我的winform应用程序运行数据库备份和还原脚本?

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

问:

我需要从我的应用程序恢复备份。我有从SSME生成的必需的脚本。

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

+0

我不知道你的SSME是什么意思,但我看到两种可能性(可能是错误的): - 无论你是在谈论一个SQL脚本 - 或者一些其他的脚本,将通过一个脚本引擎执行 我认为我们需要更多的细节。 – TimothyP 2009-01-10 14:38:27

+0

SSME = SQL Server Management Studio Express 抱歉对于误用的缩写。 :-) – 2009-01-10 15:10:43

回答

1

您可以像运行查询一样运行这些脚本,只有您不连接到要还原的数据库,而是连接到主站。

0

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

0

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

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 “[服务器]”[ServerLogonDetails] -D [数据库名] -RPT “[BackupArchive] \ BackupLog_TRN.txt”[RptExpirationSchedule] -BkUpLog “[BackupArchive]” -BkExt TRN -BkUpMedia DISK [BakExpirationSchedule] ''

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

对于恢复,您将需要杀死除内部sql server之外的所有连接。基本上将“exec sp_who”的结果以及与dbname相匹配的行的结果取为“非背景”,并且cmd不是“SIGNAL HANDLER”,“LOCK MONITOR”,“LAZY WRITER” ,“LOG WRITER”,“CHECKPOINT SLEEP”在spid上执行“kill”(例如:ExecuteNonQuery(“kill 1283”))。

您会想要陷入并忽略来自KILL命令的任何异常。你无能为力。如果由于现有连接而无法继续恢复,则会引发错误。

杀死连接的一个危险是ADO的连接池(更多用于asp.net应用程序而不是Windows应用程序)。ADO假定从连接池获取的连接是有效的......并且它对已经被终止的连接反应不佳。该连接上发生的下一个操作将失败。我不记得错误...你可能会陷入只是具体的错误,并处理它...也与3.5我认为你可以刷新连接池(所以...陷阱的错误,刷新连接池,打开连接,再次尝试命令......丑陋但可能是可行的)。