【问题标题】:Using SMO to copy duplicate a database but not transfer all data使用 SMO 复制数据库但不传输所有数据
【发布时间】:2019-08-30 12:12:39
【问题描述】:

我只需要复制数据库并传输特定表的数据,但我不知道如何在 SMO 中执行此操作

目前这是我所拥有的:

try
{
    if (isFromConsole)
        Console.WriteLine("Initializing database creation...");

    var srcDbInfo = GetInfo(srcConnectionString);
    var destDbInfo = GetInfo(destConnectionString);


    var sc = new ServerConnection();
    sc.LoginSecure = false;
    sc.ServerInstance = srcDbInfo.DataSource;
    sc.Login = srcDbInfo.UserID;
    sc.Password = srcDbInfo.Password;
    sc.ConnectTimeout = 0;
    sc.StatementTimeout = 0;

    sc.Connect();

    if (sc.IsOpen)
    {
        Server server = new Server(sc);

        Database srcDb = server.Databases[srcDbInfo.DBName];
        Database destDb = new Database(server, destDbInfo.DBName);

        // Create method will create the database on the specified server 
        if (isFromConsole)
            Console.WriteLine("Creating Database...");
        destDb.Create();

        if (isFromConsole)
            Console.WriteLine("Database successfully created...");

        //Create an object of Transfer class and pass
        //reference of source database to its construtor 
        Transfer transfer = new Transfer(srcDb);
        transfer.Options.WithDependencies = true;
        transfer.Options.ContinueScriptingOnError = true;
        // set copy options
        transfer.CopyAllObjects = true;
        transfer.CopyAllSchemas = true;
        //Copy all user defined data types from source to destination 
        transfer.CopyAllUserDefinedDataTypes = true;
        //Copy all tables from source to destination
        transfer.CopyAllTables = true;
        //Copy data of all source tables to destination tables 
        //It actually generates INSERT statement for destination 
        transfer.CopyData = true;
        //Copy all stored procedure from source to destination 
        transfer.CopyAllStoredProcedures = true;
        //set reference to all
        transfer.Options.DriAll = true;
        //specify the destination server name 
        transfer.DestinationServer = server.Name;
        //specify the destination database name and credentials
        transfer.DestinationDatabase = destDb.Name;
        transfer.DestinationLoginSecure = false;
        transfer.DestinationLogin = destDbInfo.UserID;
        transfer.DestinationPassword = destDbInfo.Password;


        //TransferData method transfers the schema objects and data 
        //whatever you have specified to destination database 
        if (isFromConsole)
            Console.WriteLine("Transferring data...");
        transfer.TransferData();


        if (isFromConsole)
            Console.WriteLine("Transfer completed...");
    }
}
catch (Exception ex)
{
    throw ex;
}

此代码复制并传输源数据库中的所有数据。我需要设置所有要复制其中所有数据的表,但我不知道如何操作,也看不到它的任何文档。

【问题讨论】:

  • 如果您使用 SQL Server 管理,简单的方法是分离数据库副本 mdf 和 ldf 文件。重新附加原始数据库。然后以不同的名称附加副本。这将复制所有内容。然后你可以删除你不想要的。
  • 查看 ObjectList 并确保将 CopyAllObjects 设置为 false stackoverflow.com/questions/26259512/…

标签: c# smo


【解决方案1】:

这是我从 VB.NET(来自我的 GitHub 存储库)转换而来的一种方法,看看这是否适合你

https://github.com/karenpayneoregon/LearningSMObasicsWithVisualBasic/blob/master/SMO_UtilityLibrary/Classes/DatabaseInformation.vb#L34

/// <summary>
/// Copy database to new database on same server
/// </summary>
/// <param name="pOriginalDatabase">Database to copy</param>
/// <param name="pNewDatabase">Copy to database with unique database name</param>
/// <returns></returns>
public bool CopyDatabase(string pOriginalDatabase, string pNewDatabase)
{

    var srv = new Server();
    Database db = null;

    db = srv.Databases[pOriginalDatabase];
    Database dbCopy = null;
    dbCopy = new Database(srv, pNewDatabase);
    dbCopy.Create();

    Transfer trans = null;
    trans = new Transfer(db)
    {
        CopyAllTables = false,
        Options =
            {
                WithDependencies = true,
                ContinueScriptingOnError = true
            },
        DestinationDatabase = pNewDatabase,
        DestinationServer = srv.Name,
        DestinationLoginSecure = true
    };
    trans.Options.DriAllKeys = true;
    trans.CopySchema = true;

    trans.TransferData();

    return true;

}

另请参阅 https://docs.microsoft.com/en-us/dotnet/api/microsoft.sqlserver.management.smo.transfer?view=sql-smo-140.17283.0

编辑我刚刚注意到您需要特定的表格,我“按原样”发布的内容不复制任何数据,仅复制结构,因此它可能无法提供您正在寻找的内容。

【讨论】:

  • 我想复制所有表,但只有特定的数据表
猜你喜欢
  • 2010-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多