首页 > 解决方案 > 用参数值替换硬编码的问题

问题描述

我的 BIML 文件中有这个结构:

myColumns = myFile.ReadLine().Replace("\"","").Split('|');

我想将其替换为:

myColumns = myFile.ReadLine().Replace("\"","").Split('<#=delimiter#>');

但显然这不起作用。不知何故syntaxhighlighting告诉我这不起作用.....

还:

string[] myFiles = Directory.GetFiles(path, "*.csv");

string[] myFiles = Directory.GetFiles(path, "*.<#=filetype#>");

当简单地使用

 myColumns = myFile.ReadLine().Replace("\"","").Split('delimiter');

它告诉我Cannot implicitly convert type 'string' to 'char'

分隔符声明为string delimiter ="|"

将其更改为时,char delimiter ="|"我得到完全相同的错误,但是在我声明分隔符的那一行.....

标签: visual-studiossissql-server-2017bimlssis-2017

解决方案


如果我对您的理解正确,那么您文件的这一部分:

myColumns = myFile.ReadLine().Replace("\"","").Split('|');

将已经包含在代码块或单独的代码文件中,是吗?如果是这样,您不需要delmiter使用另一个代码块来参数化,而只需引用该变量,假设您已经在某处声明了它:

<#
...
char delimiter = '|';
...
var myColumns = myFile.ReadLine().Replace("\"","").Split(delimiter);
...
#>

作为对您的评论的回应,在您的 Biml 文件中使用此代码可能看起来像这样?

...
 <Tables>
  <Table Name="TableName" etc>
    <Columns>
    <# // This is the start of a Code Block

     // We can define some C# data structures
     char delimiter = '|';
     var myColumns = myFile.ReadLine().Replace("\"","").Split(delimiter);

     // Then start a loop which will generate some Biml nodes
     foreach(string col in myColumns)
     {
      // Note that the foreach loop is left open despite closing the code block on the next line.
      // This means the following Biml is looped over until the foreach ends.
    #>
     <Column Name="<#=col#>" etc />
    <# // We can then start another code block which carries on from the last one
     } // This closes the foreach loop defined earlier
    #>
    </Columns>
  </Table>
 </Tables>
...

您可以在此示例中看到 C# 代码是如何包含在其中的<#,并且#>在其他任何地方都使用原始 Biml 进行标记。<#=和标记的使用#>是引用先前定义的 C# 变量的语法快捷方式。这些显然只有当您在文件的 Biml 部分中而不是在代码块中时才需要。


推荐阅读