4

我正在尝试使用 BIML 生成一个自动登台区域。源数据库是 Progress 并通过 ODBC 连接。

我正在使用以下演练: https ://www.cathrinewilhelmsen.net/2015/07/12/biml-extension-methods-getdatabaseschema/

http://bimlscript.com/walkthrough/Details/3121

1-2-环境.biml:

<Biml xmlns="http://schemas.varigence.com/biml.xsd">
   <#@ template tier="0" #>

<Connections>
    <OleDbConnection Name="Source" ConnectionString="Provider=MSDASQL;DSN=XXX;UID=XXX;PWD=XXX;" />
    <OdbcConnection Name="Source2" ConnectionString="DSN=XXX;UID=XXX;PWD=XXX;" />
    <OleDbConnection Name="Target" ConnectionString="Provider=SQLOLEDB;Server=localhost;Initial Catalog=DWH_Staging;Integrated Security=SSPI;" />
</Connections>
<Databases>
    <Database Name="DWH_Staging" ConnectionName="Target" />
    <Database Name="pa" ConnectionName="Source" />
</Databases>
<Schemas>
    <Schema Name="test" DatabaseName="DWH_Staging" />
    <Schema Name="pub" DatabaseName="pa" />
</Schemas>

Source2 是正常的 ODBC 连接,Source 是使用 OLEDB 进行 ODBC 测试。

1-2-CreateTableMetadata.biml

<#@ import namespace="System.Data" #>
<#@ import namespace="Varigence.Biml.CoreLowerer.SchemaManagement" #>

<#
var sourceConnection = RootNode.DbConnections["Source"];
var importResult = sourceConnection.GetDatabaseSchema();

#>
<Biml xmlns="http://schemas.varigence.com/biml.xsd">
  <Tables>
    <# foreach (var table in importResult.TableNodes) { #>
    <Table Name="Staging_<#=table.Schema.Name#>_<#=table.Name#>" SchemaName="DWH_Staging.test">
      <Columns>
        <# foreach (var column in table.Columns) { #>
          <# if (column.DataType == System.Data.DbType.AnsiString) { #>
            <Column Name="<#=column.Name#>" DataType="String" Length="<#=column.Length#>">
              <Annotations>
                <Annotation AnnotationType="Tag" Tag="ConvertToUnicode">yes</Annotation>
              </Annotations>
            </Column>
          <# } else { #>
            <#=column.GetBiml()#>
          <# } #>
        <# } #>
      </Columns>
      <Annotations>
        <Annotation AnnotationType="Tag" Tag="SourceSchemaQualifiedName"><#=table.SchemaQualifiedName#></Annotation>
      </Annotations>
    </Table>
    <# } #>
  </Tables>
</Biml>

1-x-DeployTargetTables.biml:

<#@ template tier="2" #>
<Biml xmlns="http://schemas.varigence.com/biml.xsd">
  <Packages>
    <Package Name="MasterTableDeploy" ConstraintMode="Parallel">
      <Tasks>
        <# foreach (var table in RootNode.Tables) { #>
        <ExecuteSQL Name="Create <#=table.Name#>" ConnectionName="Target">
          <DirectInput><#=table.GetDropAndCreateDdl()#></DirectInput>
        </ExecuteSQL>
        <# } #>
      </Tasks>
    </Package>
  </Packages>
</Biml>

问题是,生成的 MasterTableDeploy.dtsx 包不包含任何内容,它只是空的。作为测试,我使用我们自己的 SQL Server 作为源,它工作得非常好。使用 Progress ODBC Source 没有任何作用,没有错误消息。

有任何想法吗?

4

2 回答 2

2

I had a similar problem while trying to connect to a Db2 database using an ODBC connection. I ended up decompiling BimlEngine.dll and found out that this functionality is not implemented for ODBC connections. Sorry

于 2017-02-08T09:45:05.113 回答
2

我知道这已经晚了,但也许它可以帮助其他人。

某些 ODBC 提供程序和 GetDatabaseSchema() 存在问题。对我来说 ImportDB()(GetDatabaseSchema() 的旧版本)工作得很好。

于 2018-08-07T22:31:40.600 回答