如何解决CallBimlScript中的“无法转换类型为'System.String'的对象”

时间:2019-01-30 23:01:48

标签: c# biml

我有一个BIML解决方案,可以使用BimlScript通过三层调用几个.biml文件。我在CallBimlScript()中传递了一个AstConnectionNode参数。但是,当我使用AstConnectionNode参数调用它时,收到错误消息“无法将类型为'System.String'的对象转换为类型为'Varigence.Languages.Biml.Connection.AstOleDbConnectionNode'”。

  1. 参数名称为connectionWrk。我将参数初始化为第一层中的连接节点:

    <# var connStrWrk = "Data Source=SomeServer;Initial Catalog=SomeDatabase;Provider=SQLNCLI11.1;Integrated Security=SSPI;Auto Translate=False;"; #>
    <# var connectionWrk = SchemaManager.CreateConnectionNode("SchemaProvider", connStrWrk); #>
    
  2. 然后我从第一层将其作为参数传递给CallBimlScript方法:

    <#=CallBimlScript("01.01.02.GenStg_STD_FullLoad.biml", table, columnList, tableNorm, connectionWrk) #>
    
  3. 它已映射到第二层“ 01.01.02.GenStg_STD_FullLoad.biml”中的被叫方参数:

    <#@ import namespace="System.Data" #> 
    
    <#@ property name="table" type="Varigence.Languages.Biml.Table.AstTableNode" #>
    <#@ property name="columnList" type="String" #>
    <#@ property name="tableNorm" type="String" #>
    <#@ property name="connectionWrk" type="Varigence.Languages.Biml.Connection.AstOleDbConnectionNode" #>
    
  4. 然后我再次将其用作第二层的CallBimlScript()中的参数:

    <#=CallBimlScript("01.01.01.a.x.SourceFromClause.biml", hashTable, tableNorm, LoadType, connectionWrk) #>
    
  5. 它被映射到第三层的被叫方:

    <#@ import namespace="System.Data" #>
    
    <#@ property name="hashTable" type="Varigence.Languages.Biml.Table.AstTableNode" required="False"#>
    <#@ property name="tableNorm" type="String" required="True"#>
    <#@ property name="LoadType" type="String" required="True"#>
    <#@ property name="connectionWrk" type="Varigence.Languages.Biml.Connection.AstOleDbConnectionNode" required="True" #>`
    
  6. 然后我用它来获取SQL Server数据库中的元数据:

    <#
    var JoinLogic = ExternalDataAccess.GetDataTable(connectionWrk.ConnectionString, 
                                             "SELECT [TABLE_NAME_SRC], [FROM_TABLE], [RANK], " +
                                             "[JOIN_TYPE], [JOIN_TABLE], [JOIN_KEY], [WHERE_CLAUSE] " +
                                             "FROM [PHDDV_VMC_WORK].[ETL_WORK].[VMC_STG_FROM_WHERE_CLS] " +
                                             "WHERE [TABLE_NAME_SRC] = '" + tableNorm + "' " + 
                                             "AND [FROM_TABLE] != '" + tableNorm + "' " + 
                                             "ORDER BY [RANK]; "
                                             ).Rows.OfType<DataRow>().Select(r => new[]
                                                                                      {
                                                                                       r["TABLE_NAME_SRC"].ToString(),
                                                                                       r["FROM_TABLE"].ToString(),
                                                                                       r["RANK"].ToString(),
                                                                                       r["JOIN_TYPE"].ToString(),
                                                                                       r["JOIN_TABLE"].ToString(),
                                                                                       r["JOIN_KEY"].ToString(),
                                                                                       r["WHERE_CLAUSE"].ToString()
                                                                                      });
    #>
    

据我所知,它在所有三层中都具有Varigence.Languages.Biml.Connection.AstOleDbConnectionNode的类型。

在以前的BIML解决方案中,通过多个层使用参数已经为我工作,但是这次我很困惑如何在所有三个层中将此参数解释为AstOleDbConnectionNode。

为什么将其解释为String类型,我该怎么做才能解决或解决该问题?

我需要能够在模块化代码中使用此连接节点参数,以在多个BIML文件中重用逻辑。

1 个答案:

答案 0 :(得分:1)

从第三层/步骤5中删除所需的是非(或更改您的调用顺序)。我会去挖掘笔记,但我认为我记得它会影响参数的顺序。从逻辑上讲,这很有意义-您必须首先提供所需的参数,然后列出可选参数。

我制作了一个快速的复制品,您可以通过使4看起来像来验证行为

<#=CallBimlScript(child, columnList, tableNorm, connectionWrk, table) #>

(或者您已经在第二层中修改了值)

我的复制人

第1层代码

<Biml xmlns="http://schemas.varigence.com/biml.xsd">
<# var connStrWrk = @"Data Source=.\dev2017;Initial Catalog=tempdb;Provider=SQLNCLI11.1;Integrated Security=SSPI;Auto Translate=False;"; #>
<# var connectionWrk = SchemaManager.CreateConnectionNode("SchemaProvider", connStrWrk); #> 
<# string child = "so_54450877.tier2.biml" ;
   Varigence.Languages.Biml.Table.AstTableNode table = new Varigence.Languages.Biml.Table.AstTableNode(null);
   table.Name = "tablename";
   string columnList = "column,list";
   string tableNorm = "tablenormname";
   #>
<#=CallBimlScript(child, table, columnList, tableNorm, connectionWrk) #>
</Biml>

第2级代码

<#@ import namespace="System.Data" #> 

<#@ property name="table" type="Varigence.Languages.Biml.Table.AstTableNode" #>
<#@ property name="columnList" type="String" #>
<#@ property name="tableNorm" type="String" #>
<#@ property name="connectionWrk" type="Varigence.Languages.Biml.Connection.AstOleDbConnectionNode" #>
<!-- Tier 2 debug -->
<# string child = "so_54450877.tier3.biml" ;
var results = ExternalDataAccess.GetDataTable(connectionWrk,"SELECT 'This is tier 2' AS TierName;") ;
foreach (System.Data.DataRow row in results.Rows)
{
    for (int columnIndex = 0; columnIndex < results.Columns.Count; columnIndex++)
    {
        Write(string.Format("<!-- {0} -->\t", row[columnIndex]));
    }

    Write("\n");
}

#>
<#=CallBimlScript(child, columnList, tableNorm, connectionWrk, table) #>
<!-- Tier 2 end debug -->

第3层代码

<#@ import namespace="System.Data" #>

<#@ property name="hashTable" type="Varigence.Languages.Biml.Table.AstTableNode" required="False"#>
<#@ property name="tableNorm" type="String" required="True"#>
<#@ property name="LoadType" type="String" required="True"#>
<#@ property name="connectionWrk" type="Varigence.Languages.Biml.Connection.AstOleDbConnectionNode" required="True" #>
<!-- I exist -->
<# 
string connstring = connectionWrk.ConnectionString;
var results = ExternalDataAccess.GetDataTable(connectionWrk,"SELECT 'This is tier 3' AS TierName;") ;

foreach (System.Data.DataRow row in results.Rows)
{
    for (int columnIndex = 0; columnIndex < results.Columns.Count; columnIndex++)
    {
        Write(string.Format("!<-- {0} -->\t", row[columnIndex]));
    }

    Write("\n");
}
#>

结果

Debug output