2008-09-15 54 views
6

我在寫一個C#應用程序,它通過FTP下載壓縮數據庫備份。應用程序然後需要提取備份並將其恢復到默認的數據庫位置。C#SQL將數據庫還原到默認數據位置

我不會知道哪個版本的SQL Server將被安裝在應用程序運行的機器上。因此,我需要根據實例名稱(位於配置文件中)找到默認位置。

我發現的所有示例都有一個他們讀取的註冊表項,但這不起作用,因爲這假定只安裝了一個SQL實例。

我發現另一個例子創建了一個數據庫,讀取該數據庫的文件屬性,一旦完成就刪除數據庫。這只是麻煩。

我發現在.NET框架的一些東西,應該工作,即:

Microsoft.SqlServer.Management.Smo.Server(ServerName).Settings.DefaultFile

的問題是,這是返回空字符串,這於事無補。

我還需要找出正在運行SQL服務的NT帳戶,以便我可以在備份文件解壓後將該用戶的讀取權限授予該用戶。

回答

7

我發現那是什麼時,有沒有明確定義的路徑

Microsoft.SqlServer.Management.Smo.Server(ServerName).Settings.DefaultFile 

只返回非空。只要你指定一個不是默認的路徑,那麼這個函數就會正確地返回該路徑。

所以,一個簡單的解決方法是檢查此函數是否返回字符串或null。如果它返回一個字符串,然後使用,但如果它是零,使用

Microsoft.SqlServer.Management.Smo.Server(ServerName).Information.RootDirectory + "\\DATA\\" 
1

一個可能更簡單的解決方案就是在目標服務器上創建一個新的數據庫,然後在備份的基礎上對該數據庫執行RESTORE操作。您的備份將位於正確的位置,並且您在恢復備份文件時不必擔心「移動」備份文件。 SQL期望將備份恢復到與從其備份的物理路徑完全相同的物理路徑。如果不是這種情況,則必須在RESTORE期間使用MOVE選項。 此解決方案還可以更輕鬆地在過程中重命名數據庫,例如,如果您想在名稱上添加日期。

+0

這是一個好主意,但我不希望使用默認名稱爲MDF和LDF文件。我希望那些包含日期戳。爲了做到這一點,我需要在創建臨時數據庫時指定文件名,這會使我回到需要默認路徑。 – RichieACC 2008-09-15 14:19:16

+0

可能適用於您的一個訣竅是使用包含完整時間戳的名稱創建數據庫,然後將數據庫重命名爲任何應該使用的數據庫。重命名數據庫不會更改文件名。這樣就可以用正確的名稱創建文件。 – 2008-09-22 13:31:19

+0

Darrel,爲了指定文件名,您需要指定完整路徑。 SQL似乎沒有任何相對路徑的概念。 – RichieACC 2008-12-03 10:50:46

4

一種方法是使用與主數據庫相同的位置。您可以使用以下SQL查詢SQL Server實例:

select filename from master.dbo.sysdatabases where name = 'master' 

這將返回master數據庫的完整路徑。通過該路徑,可以使用FileInfo對象來提取該路徑的目錄部分。這樣可以避免在嘗試連接的SQL Server實例中檢查註冊表的猜測工作。