我有一个BIML解决方案,可以使用BimlScript通过三层调用几个.biml文件。我在CallBimlScript()中传递了一个AstConnectionNode参数。但是,当我使用AstConnectionNode参数调用它时,收到错误消息“无法将类型为'System.String'的对象转换为类型为'Varigence.Languages.Biml.Connection.AstOleDbConnectionNode'”。
参数名称为connectionWrk。我将参数初始化为第一层中的连接节点:
<# var connStrWrk = "Data Source=SomeServer;Initial Catalog=SomeDatabase;Provider=SQLNCLI11.1;Integrated Security=SSPI;Auto Translate=False;"; #>
<# var connectionWrk = SchemaManager.CreateConnectionNode("SchemaProvider", connStrWrk); #>
然后我从第一层将其作为参数传递给CallBimlScript方法:
<#=CallBimlScript("01.01.02.GenStg_STD_FullLoad.biml", table, columnList, tableNorm, connectionWrk) #>
它已映射到第二层“ 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" #>
然后我再次将其用作第二层的CallBimlScript()中的参数:
<#=CallBimlScript("01.01.01.a.x.SourceFromClause.biml", hashTable, tableNorm, LoadType, connectionWrk) #>
它被映射到第三层的被叫方:
<#@ 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" #>`
然后我用它来获取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文件中重用逻辑。
答案 0 :(得分:1)
从第三层/步骤5中删除所需的是非(或更改您的调用顺序)。我会去挖掘笔记,但我认为我记得它会影响参数的顺序。从逻辑上讲,这很有意义-您必须首先提供所需的参数,然后列出可选参数。
我制作了一个快速的复制品,您可以通过使4看起来像来验证行为
<#=CallBimlScript(child, columnList, tableNorm, connectionWrk, table) #>
(或者您已经在第二层中修改了值)
我的复制人
<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>
<#@ 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 -->
<#@ 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");
}
#>
结果