使用ObjectList时,通过SMO传输数据失败

本文关键字:传输 数据 失败 SMO 通过 ObjectList 使用 | 更新日期: 2023-09-27 18:25:54

我可以使用CopyAllTables=true选项将所有数据从源数据库传输到目标数据库,而不在ObjectList中提供列表。

            ServerConnection conn = new ServerConnection(sourceServer);
            conn.LoginSecure = true;
            Server srvSource = new Server(conn);
            Database dbSource = srvSource.Databases[sourceDB];
            Transfer xfr = new Transfer(dbSource);
            xfr.CopyAllTables = true;
            xfr.Options.WithDependencies = false;
            xfr.Options.ContinueScriptingOnError = false;
            xfr.DestinationDatabase = destDB;
            xfr.DestinationServer = destServer;
            xfr.Options.DriAllKeys = true;
            xfr.Options.DriForeignKeys = true;
            xfr.DestinationLoginSecure = true;
            xfr.CopySchema = false;
            xfr.CopyData = true;
            xfr.TransferData();

这样可以将所有数据复制到目标数据库中。我需要从复制过程中排除一个表。我试过

            ServerConnection conn = new ServerConnection(sourceServer);
            conn.LoginSecure = true;
            Server srvSource = new Server(conn);
            Database dbSource = srvSource.Databases[sourceDB];
            Transfer xfr = new Transfer(dbSource);
            xfr.CopyAllTables = false;
            xfr.Options.WithDependencies = false;
            xfr.Options.ContinueScriptingOnError = false;
            xfr.DestinationDatabase = destDB;
            xfr.DestinationServer = destServer;
            xfr.Options.DriAllKeys = true;
            xfr.Options.DriForeignKeys = true;
            xfr.DestinationLoginSecure = true;
             foreach (Table tb in dbSource.Tables)
            {
                if (tb.IsSystemObject == false && tb.Name != "ExcludedTable" )
                {
                    xfr.ObjectList.Add(tb);
                }
            }
            xfr.CopySchema = false;
            xfr.CopyData = true;
            xfr.TransferData();

当调用TransferData时,我得到一个异常"System.NullReferenceException",并且没有数据传输

{"Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt."}
    [System.NullReferenceException]: {"Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt."}
    Data: {System.Collections.ListDictionaryInternal}
    HelpLink: null
    HResult: -2147467261
    InnerException: null
    Message: "Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt."
    Source: "Microsoft.SqlServer.SmoExtended"
    StackTrace: "   bei Microsoft.SqlServer.Management.Smo.Transfer.GetObjectList()'r'n   
    bei Microsoft.SqlServer.Management.Smo.Transfer.Microsoft.SqlServer.Management.Common.ITransferMetadataProvider.SaveMetadata()'r'n 
    bei Microsoft.SqlServer.Management.Dts.DtsTransferProvider.Configure(ITransferMetadataProvider metadataProvider)'r'n  
    bei Microsoft.SqlServer.Management.Smo.Transfer.GetTransferProvider()'r'n   
    bei Microsoft.SqlServer.Management.Smo.Transfer.TransferData()'r'n  
    TargetSite: {Microsoft.SqlServer.Management.Smo.DependencyCollection GetObjectList()}

如何从导出中排除"ExcludedTable"?

使用ObjectList时,通过SMO传输数据失败

xfr.CopyAllTables = false;外,还必须设置:

xfr.CopyAllObjects = false;

默认情况下,它设置为true,这就是出现错误的原因。如果省略这一行,则会得到您提到的null引用异常。

(验证您的代码并使用110''SDK''Assemblys)