2016-08-22 97 views
1

由於我正在使用SMO將數據從一個數據庫複製到另一個數據庫。我用我自己的DB輔助類。我在傳輸數據時遇到了異常情況。Integration Services組件未安裝,或者您沒有使用它的權限

Integration Services組件未安裝,或者您沒有使用它的權限。

我的代碼如下:

public class DBHelper 
{ 
    #region Private Variables 
    private static string sourceSQLServer; 
    private static string destinationSQLServer; 
    private static string sourceDatabase; 
    private static string destinationDatabase; 
    #endregion 

    #region Properties 

    /// <summary> 
    /// SourceSQLServer Holds Instance Name of Source SQL Server Database Name 
    /// </summary> 
    public static string SourceSQLServer 
    { 
     get { return DBHelper.sourceSQLServer; } 
     set { DBHelper.sourceSQLServer = value; } 
    } 

    /// <summary> 
    /// DestinationSQLServer Holds Instance Name of Destination SQL Server Database Name 
    /// </summary> 
    public static string DestinationSQLServer 
    { 
     get { return DBHelper.destinationSQLServer; } 
     set { DBHelper.destinationSQLServer = value; } 
    } 

    /// <summary> 
    /// SourceDatabase Holds Source Database 
    /// </summary> 
    public static string SourceDatabase 
    { 
     get { return DBHelper.sourceDatabase; } 
     set { DBHelper.sourceDatabase = value; } 
    } 

    /// <summary> 
    /// DestinationDatabase Holds Destination Database Name 
    /// </summary> 
    public static string DestinationDatabase 
    { 
     get { return DBHelper.destinationDatabase; } 
     set { DBHelper.destinationDatabase = value; } 
    } 
    #endregion 

    #region Static Methods 
    /// <summary> 
    /// CopyDatabase Copies Database 
    /// </summary> 
    /// <param name="CopyData">True if Want to Copy Data otherwise False</param> 
    public static void CopyDatabase(bool bCopyData) 
    { 
     //Set Source SQL Server Instance Information 
     Server server = new Server(DBHelper.SourceSQLServer); 

     //Set Source Database Name [Database to Copy] 
     Database database = server.Databases[DBHelper.SourceDatabase]; 

     //Set Transfer Class Source Database 
     Transfer transfer = new Transfer(database); 

     //Yes I want to Copy All the Database Objects 
     transfer.CopyAllObjects = true; 

     //In case if the Destination Database/Objects Exists Drop them First 
     transfer.DropDestinationObjectsFirst = true; 

     //Copy Database Schema 
     transfer.CopySchema = true; 

     //Copy Database Data Get Value from bCopyData Parameter 
     transfer.CopyData = bCopyData; 

     //Set Destination SQL Server Instance Name 
     transfer.DestinationServer = DBHelper.DestinationSQLServer; 

     //Create The Database in Destination Server 
     transfer.CreateTargetDatabase = true; 

     //Set Destination Database Name 
     Database ddatabase = new Database(server, DBHelper.DestinationDatabase); 

     //Create Empty Database at Destination 
     ddatabase.Create(); 

     //Set Destination Database Name 
     transfer.DestinationDatabase = DBHelper.DestinationDatabase; 

     //Include If Not Exists Clause in the Script 
     transfer.Options.IncludeIfNotExists = true; 

     //Start Transfer 
     transfer.TransferData(); 

     //Release Server variable 
     server = null; 
    } 
    #endregion 
} 

和主要功能我打電話提前這個

DBHelper.SourceSQLServer = @"DESKTOP-PCEOPRM\SQLEXPRESS"; 

//Set Your Database Name Here (To Be Copied or Scripted) 
DBHelper.SourceDatabase = "MetisEmptyDB"; 

////Set Destination SQL Server Name Here 
DBHelper.DestinationSQLServer = @"DESKTOP-PCEOPRM\SQLEXPRESS"; 

//Set New Database Name Here 
DBHelper.DestinationDatabase = "NewDb"; 

//Set True if you want to copy Data 
//Set False if you want to copy Only Schema 
DBHelper.CopyDatabase(true); 
Console.WriteLine("Scripting Finished"); 

感謝。如果您發現在C#中使用現有數據庫創建新數據庫的任何其他替代方法都可能需要共享代碼。

回答

0

線索出錯。您正在嘗試使用SQL Server Integration Services的代碼,但未包含在SQL Server Express中。

使用T-SQL,這些事情也更加容易。您可以輕鬆創建新的空數據庫並編寫對象腳本。或者備份並恢復數據庫。

我不應該在這裏發佈的代碼計算器,因爲它會在dba.stackexchange.com

BACKUP DATABASE AdventureWorks2012 
TO DISK = 'C:\SQLServerBackups\AdvWorksData.bak' 
WITH FORMAT; 

得到更好的要求,並在其他服務器上恢復

RESTORE DATABASE AdventureWorks2012 
    FROM DISK = 'C:\SQLServerBackups\AdventureWorks2012.bak'; 

確保您在嘗試通過C#來完成之前,瞭解你在SQL中做了什麼。如果您按照以前的問題推薦的方式使用SQLCMD手動執行了所有的SQL,那麼您將學習更多關於SQL的知識。

+0

我在這個問題上也使用過這個代碼,而不是幫助人們投票。我不知道爲什麼人們用初學者這樣做。如果你能幫忙,請看看這個問題。 @Mike http://stackoverflow.com/questions/39019461/run-a-script-on-existing-database-from-sql-file-in-c-sharp/39019576 – Umar

+0

我添加了最簡單的SQL示例備份和恢復數據庫。確保它在SQL中運行,然後再嘗試從c#運行它# – Mike

+0

謝謝@Mike,它是最簡單的。我讀了三種方法,一種是SMO,另一種是你提出的方法,第三種是使用SQLcmd的過程方法。希望這個人能工作! – Umar

0

對我來說,當我將依賴關係從SQL Server 2008 Express更改爲SQL Server 2012 Express時,此錯誤消失了。

我引用的

C:\Program Files (x86)\Microsoft SQL Server\110\SDK\Assemblies 

C:\Program Files (x86)\Microsoft SQL Server\100\SDK\Assemblies 

如果你能夠改變的依賴關係,然後它工作的組件。

相關問題