2017-01-10 2 views
4

J'essaie de générer une zone de transfert automatisée avec BIML. La base de données source est Progress et est connectée par ODBC.BIML GetDatabaseSchema ne fonctionne pas avec la base de données de source de progression ODBC

J'utilise le soluces suivant: https://www.cathrinewilhelmsen.net/2015/07/12/biml-extension-methods-getdatabaseschema/

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

1-2-Environment.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 est la connexion ODBC normale , Source est un test en utilisant OLEDB pour 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> 

Le problème est, le paquet généré ne pas MasterTableDeploy.dtsx contenir quelque chose, c'est juste vide. En tant que test, j'ai utilisé notre propre SQL Server en tant que source, ce qui fonctionne parfaitement bien. L'utilisation de la source ODBC de progression ne fait rien, aucun message d'erreur.

Des idées?

+0

Est-ce que vous ou quelqu'un d'autre avez accès aux journaux de la base de données? Habituellement dbname.lg. Peut-être qu'ils révèlent quelque chose? – Jensd

+0

Bonjour, quels journaux voulez-vous dire? Du progrès? – RoundFour

+0

Exactement. Il y a au moins un journal de base de données appelé "databasename.lg". Si vous utilisez appserver, il existe également des fichiers nommés asbroker1.server.log et asbroker1.broker.log. Ces noms sont standard, mais ils peuvent être renommés (à l'exception du journal de la base de données). – Jensd

Répondre

1

J'ai rencontré un problème similaire lors de la tentative de connexion à une base de données Db2 à l'aide d'une connexion ODBC. J'ai fini par décompiler BimlEngine.dll et j'ai découvert que cette fonctionnalité n'était pas implémentée pour les connexions ODBC. Désolé

+1

Merci pour votre réponse. Si c'est vrai, pourquoi ne le disent-ils pas quelque part? Nous avons perdu quelques heures en essayant de faire fonctionner ça. – RoundFour

+0

Puisque vous incluez System.DB, vous pouvez essayer directement en utilisant la méthode System.DB.ODBC.GetSchema() (ou System.DB.Oledb.GetSchema(), si OleDB est votre poison ...) et travailler à partir de Là. J'ai fait quelque chose comme ça une fois dans une tâche de script pour interroger un pilote/base de données "ODBC" particulier non-conforme pour ses objets de schéma ... – user1390375