SSIS - TaskHost对象 - 数据库模式

时间:2012-07-16 14:46:45

标签: c# ssis

如何在C#中使用TaskHost对象(我在SSIS脚本任务中使用它,但这通常也适用于C#)并处理不在“dbo”模式中的表?

我编写的代码基本上连接到源数据库和目标数据库,然后应该逐个引入特定的表(在循环内),包括表模式和数据。

在我的本地主机上,这只是很好用,但在我的客户端,供应商正在使用模式;不是我们原本考虑的东西,这给了我一些麻烦。

我尝试使用TaskHost对象的“SchemasList”属性,但仍然遇到同样的错误:

? child.Errors[0]
{Microsoft.SqlServer.Dts.Runtime.DtsError}
    base {Microsoft.SqlServer.Dts.Runtime.DtsObject}: {Microsoft.SqlServer.Dts.Runtime.DtsError}
    Description: "Table \"[theSchema].[theTable]\" does not exist at the    source.\r\n"
ErrorCode: -1073548445
HelpContext: 0
HelpFile: ""
IDOfInterfaceWithError: "{B6F6D221-FC27-4F71-B5A0-597583986C28}"
Source: "{D6DF0C1F-0AC8-4748-836C-BEF052454AEE}"
SubComponent: "Transfer SQL Server Objects Task"
TimeStamp: {16-07-2012 13:41:43}

以下是代码:

if (Dts.Variables["tableName"].Value.ToString() != "0") {
        string tableName;
        tableName = Dts.Variables["tableName"].Value.ToString();

        // Add a child package 
        Package child = new Package();

        child.Name = tableName;
        Executable moveTable = child.Executables.Add("STOCK:TransferSQLServerObjectsTask");
        TaskHost moveTableTask = (TaskHost)moveTable;

        // Set properties for the task
        moveTableTask.Properties["CopyAllObjects"].SetValue(moveTableTask, false);
        moveTableTask.Properties["CopyAllTables"].SetValue(moveTableTask, false);
        moveTableTask.Properties["CopySchema"].SetValue(moveTableTask, true);
        moveTableTask.Properties["DropObjectsFirst"].SetValue(moveTableTask, true);
        moveTableTask.Properties["CopyData"].SetValue(moveTableTask, true);

        // Set schemas
        //StringCollection schemas = new StringCollection();
        //String[] schemaList = new String[] {"[theSchema].[" + tableName + "]"};
        //schemas.AddRange(schemaList);
        //moveTableTask.Properties["SchemasList"].SetValue(moveTableTask, schemas);

        // Set tablenames
        StringCollection tables = new StringCollection();
        tables.Add(tableName);
        moveTableTask.Properties["TablesList"].SetValue(moveTableTask, tables);

        // Set up connections
        ConnectionManager source;
        ConnectionManager destination;

        source = child.Connections.Add("SMOServer");
        source.ConnectionString = "SqlServerName=*****;UseWindowsAuthentication=False;UserName=*****;Password=*****;";
        source.Name = "Source";

        destination = child.Connections.Add("SMOServer");
        destination.ConnectionString = "SqlServerName=*****;Persist Security Info=True;Password=*****;USER ID=*****;Initial Catalog=*****";
        destination.Name = "Destination";
        moveTableTask.Properties["SourceConnection"].SetValue(moveTableTask, "Source");
        moveTableTask.Properties["SourceDatabase"].SetValue(moveTableTask, "*****");
        moveTableTask.Properties["DestinationConnection"].SetValue(moveTableTask, "Destination");
        moveTableTask.Properties["DestinationDatabase"].SetValue(moveTableTask, "*****");

        child.Execute();

        child.Dispose();

正如您所看到的,有一个注释位,试图看看我是否可以通过这种方式添加架构。我尝试的另一个选项是使用CopyAllSchemas属性,但这也没有做任何事情。

我还尝试在代码行中添加模式,其中tablename被添加到表stringcollection中,但是产生相同的错误,无论是否使用方括号([])。默认情况下,TaskHost似乎只接受“dbo”模式中的表,除非我遗漏了某些内容。

有没有人知道如何让TaskHost处理数据库架构?

1 个答案:

答案 0 :(得分:0)

事实证明,这些表不是表,而是视图。使用Views集合的组合,以及对模式的一些额外调整,我设法让事情发挥作用:)