Устранение неполадок «Невозможно привести объект типа« System.String »в CallBimlScript - PullRequest
0 голосов
/ 31 января 2019

У меня есть решение BIML, которое вызывает несколько файлов .biml через три уровня, используя BimlScript.Я передаю параметр AstConnectionNode в CallBimlScript ().Однако, когда я вызываю его с помощью параметра 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 aи что я могу сделать, чтобы решить эту проблему или устранить ее?

Мне нужно иметь возможность использовать этот параметр узла соединения в модульном коде для повторного использования логики в нескольких файлах BIML.

1 Ответ

0 голосов
/ 31 января 2019

Отбросьте требуемое true / false с третьего уровня / шага 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...