2017-02-17 78 views
2

我正在嘗試爲Windows窗體應用程序創建備份和恢復功能。如何以編程方式恢復SQL本地數據庫

所以,我試圖做一個數據庫恢復。我的代碼是這樣的:

string cbdfilename = "c:\\Users\\Public\\Public Document"; 
SqlConnection.ClearAllPools(); 
SqlConnection con = new SqlConnection("Data Source=(LocalDB)\\v11.0;AttachDbFilename=|DataDirectory|\\BbCon.mdf;Integrated Security=True;Connect Timeout=30;"); 
string sql; 

sql = "Use master;Alter Database BbCon Set Single_User With Rollback Immediate;Restore Database BbCon From Disk = @FILENAME With Replace;Alter Database BbCon Set Multi_User;"; 

SqlCommand cmd = new SqlCommand(sql, con); 
cmd.Parameters.AddWithValue("@FILENAME", cbdfilename); 

con.Open(); 

try 
{ 
    cmd.ExecuteNonQuery(); 
} 
catch(Exception ex) 
{ 
    MessageBox.Show("Restore DB failed" + ex.ToString()); 
} 
finally 
{ 
    con.Close(); 
    con.Dispose(); 
} 

但是當我嘗試運行此,我得到一個錯誤:

Restore db failed System.Data.SqlClient.SqlException(0X80131904):userdoesnot have permission to alter database BbCon.mdf the database doesnot exist or or datbase is not in a state that allows access checks.

誰能幫助我嗎?

+0

這是一個本地數據庫,只需從它斷開連接,並使用System.IO命令(如FileStream)複製文件。然後恢復它只是用備份的副本覆蓋MDB。 我不相信本地數據庫mdb文件有系統/主表等,或者備份/恢復命令將在他們的工作。 –

+0

@Ryan Mann,localDB是MDF,也有標準的備份/恢復命令。但有些部分是正確的,當我們只需要一份MDF(不是備份)時,我們需要停止服務器並且僅僅複製。 –

+0

而'ALTER DATABASE'需要以管理員身份連接到主數據庫(集成安全= TRUE)。那麼具有權限的異常消息將被解決。 –

回答

4

您是否正在備份或恢復?您在標題中提到了備份,並且該命令用於恢復。

對於localDB還沒有太多的例子。

利用我的代碼如下。希望這有助於..

對於備份 -

string master_ConnectionString = @"Data Source=(LocalDB)\MSSQLLocalDB;Database=Master;Integrated Security=True;Connect Timeout=30;"; 

using (SqlConnection masterdbConn = new SqlConnection()) 
{ 
    masterdbConn.ConnectionString = master_ConnectionString; 
    masterdbConn.Open(); 

    using (SqlCommand multiuser_rollback_dbcomm = new SqlCommand()) 
    { 
     multiuser_rollback_dbcomm.Connection = masterdbConn; 
     multiuser_rollback_dbcomm.CommandText= @"ALTER DATABASE yourdbname SET MULTI_USER WITH ROLLBACK IMMEDIATE"; 

     multiuser_rollback_dbcomm.ExecuteNonQuery(); 
    } 
    masterdbConn.Close(); 
} 

SqlConnection.ClearAllPools(); 

using (SqlConnection backupConn = new SqlConnection()) 
{ 
    backupConn.ConnectionString = yourConnectionString; 
    backupConn.Open(); 

    using (SqlCommand backupcomm = new SqlCommand()) 
    { 
     backupcomm.Connection = backupConn; 
     backupcomm.CommandText= @"BACKUP DATABASE yourdbname TO DISK='c:\yourdbname.bak'"; 
     backupcomm.ExecuteNonQuery(); 
    } 
    backupConn.Close(); 
} 

對於Restore-

string master_ConnectionString = @"Data Source=(LocalDB)\MSSQLLocalDB;Database=Master;Integrated Security=True;Connect Timeout=30;"; 

using (SqlConnection restoreConn = new SqlConnection()) 
{ 
    restoreConn.ConnectionString = master_ConnectionString; 
    restoreConn.Open(); 

    using (SqlCommand restoredb_executioncomm = new SqlCommand()) 
    { 
     restoredb_executioncomm.Connection = restoreConn; 
     restoredb_executioncomm.CommandText = @"RESTORE DATABASE yourdbname FROM DISK='c:\yourdbname.bak'"; 

     restoredb_executioncomm.ExecuteNonQuery(); 
    } 
    restoreConn.Close(); 
} 

更新 -

哎呀,對不起,我的代碼是SQL的LocalDB 2014但似乎你'使用2012. 請將(LocalDB)\ MSSQLLocalDB替換爲(LocalDB)\ v11.0

只要嘗試一下上面的更改。

根據我的經驗,如果我寫了|數據目錄|在我的connectionString中,我只能讀取(SQL SELECT命令)數據庫。換句話說,插入和更新命令可以完成,但是沒有任何例外,數據庫沒有被插入或更新。我認爲設置爲|數據目錄|會將數據庫設置爲只讀,我發現有些人在使用|數據目錄|插入或更新數據庫時遇到困難設置。

希望你的美好時光!謝謝 !

+0

感謝您的代碼,但是當我試着上面的代碼我得到一個錯誤的錯誤-50數據庫運行時錯誤提供的數據庫實例名稱無效可以請你幫我 –

+0

你能幫我 –

+0

當然,如果人們真的需要幫助... Kindly被建議爲我更新的答案。謝謝 ! –

相關問題