2009-01-10 15 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我認爲你可以刷新連接池(所以...陷阱的錯誤,刷新連接池,打開連接,再次嘗試命令......醜陋但可能是可行的)。