Using SMO to copy a database and data

后端 未结 4 978
陌清茗
陌清茗 2021-01-31 18:49

I am trying to make a copy of a database to a new database on the same server. The server is my local computer running SQL 2008 Express under Windows XP. Doing this should be q

相关标签:
4条回答
  • 2021-01-31 19:21

    Try setting SetDefaultInitFields to true on the Server object.

    I had the same issue with the SMO database object running slowly. I guess this is because sql server doesn't like to retrieve entire objects and collections at once, instead lazy loading everything, causing a round-trip for each field, which for an entire database is pretty inefficient.

    0 讨论(0)
  • 2021-01-31 19:28

    I had a go at getting this working and have come up with an answer that doesn't use the Transfer class. Here is the Method i used:

           public bool CreateScript(string oldDatabase, string newDatabase)
       {
           SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=" + newDatabase + ";User Id=sa;Password=sa;");
           try
           {
               Server sv = new Server();
               Database db = sv.Databases[oldDatabase];
    
               Database newDatbase = new Database(sv, newDatabase);
               newDatbase.Create(); 
    
               ScriptingOptions options = new ScriptingOptions();
               StringBuilder sb = new StringBuilder();
               options.ScriptData = true;
               options.ScriptDrops = false;
               options.ScriptSchema = true;
               options.EnforceScriptingOptions = true;
               options.Indexes = true;
               options.IncludeHeaders = true;
               options.WithDependencies = true;
    
               TableCollection tables = db.Tables;
    
               conn.Open();
               foreach (Table mytable in tables)
               {
                   foreach (string line in db.Tables[mytable.Name].EnumScript(options))
                   {
                       sb.Append(line + "\r\n");
                   }
               }
               string[] splitter = new string[] { "\r\nGO\r\n" };
               string[] commandTexts = sb.ToString().Split(splitter, StringSplitOptions.RemoveEmptyEntries);
               foreach (string command in commandTexts)
               {
                   SqlCommand comm = new SqlCommand(command, conn);
                   comm.ExecuteNonQuery();
               }
               return true;
           }
           catch (Exception e)
           {
               System.Diagnostics.Debug.WriteLine("PROGRAM FAILED: " + e.Message);
               return false;
           }
           finally
           {
               conn.Close();
           }
       }
    
    0 讨论(0)
  • 2021-01-31 19:40

    Well, after contacting Microsft Support I got it working properly, but it is slow and more or less useless. Doing a backup and then a restore is much faster and I will be using it as long as the new copy should live on the same server as the original.

    The working code is as follows:

    ServerConnection conn = new ServerConnection("rune\\sql2008");
    Server server = new Server(conn);
    
    Database newdb = new Database(server, "new database");
    newdb.Create();
    
    Transfer transfer = new Transfer(server.Databases["source database"]);
    transfer.CopyAllObjects = true;
    transfer.CopyAllUsers = true;
    transfer.Options.WithDependencies = true;
    transfer.DestinationDatabase = newdb.Name;
    transfer.DestinationServer = server.Name;
    transfer.DestinationLoginSecure = true;
    transfer.CopySchema = true;
    transfer.CopyData = true;
    transfer.Options.ContinueScriptingOnError = true;
    transfer.TransferData();
    

    The trick was to set the DestinationDatabase property. This must be set even if the target is that same as the source. In addition I had to connect to the server as a named instance instead of using the other connection options.

    0 讨论(0)
  • 2021-01-31 19:44

    Here is my solution:

    1. I have a Database named is Olddatabase
    2. I backup it to E:\databackup\Old.bak

    3. If you want to create a Duplicate Database from Olddatabase in the same server with name NewDatabase

    3.1 You can use command in query tool : EXEC OldDatabase.dbo.sp_helpfile; to determinat path of OldDatabase is stored in case you want to save NewDatabase in the same folder.

    or You can save NewDatabase in new Path which you want

    1. use this command in Query tool

      RESTORE DATABASE NewDatabase FROM DISK = 'E:\databackup\Old.bak' WITH MOVE 'OldDatabase' TO 'E:\New path (or the same path)\NewDatabase_Data.mdf', MOVE 'OldDatabase_log' TO 'E:\New path (or the same path)\NewDatabase_Log.ldf';

    Note: you can Use these command obove in c# with : Create a Store procedure in sql which include Above commands. And you can call the store procedure in C #

    0 讨论(0)
提交回复
热议问题