Wie man einen Dacpac durchquert

Wir möchten unser dbproj auf ein sqlproj aktualisieren, damit wir es auf eine neue SQL 2012-Datenbank verweisen können. Momentan haben wir ein Programm, das die .dbschema-XML-Datei liest, um alle Tabellen und Spalten zu finden und Informationen daraus abzurufen. Wir verwenden diese Daten, um unsere eigenen benutzerdefinierten Klassen zu erstellen.

Die neue sqlproj-Datei erzeugt jetzt einen Dacpac, den wir interrigieren möchten, um die benötigten Daten zu erhalten. Ich habe Folgendes geschrieben, um zu versuchen, den Dacpac zu durchlaufen und die benötigten Informationen zu erhalten:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.SqlServer.Dac;
using Microsoft.SqlServer.Dac.Extensions;
using Microsoft.SqlServer.Dac.Model;
namespace DacPacReader
{
    class Program
    {
        static void Main(string[] args)
        {
            using (System.IO.TextWriter writter = new System.IO.StreamWriter(@"c:\temp\output.txt"))
            {
                using (TSqlModel model = new TSqlModel(@"C:\temp\Data.dacpac"))
                {
                    var allTables = model.GetObjects(DacQueryScopes.All, ModelSchema.Table);

                    foreach (var table in allTables)
                    {
                        writter.WriteLine(table.Name);
                        foreach (var column in table.GetChildren().Where(child => child.ObjectType.Name == "Column"))
                        {
                            writter.WriteLine("\t" + column.Name);
                            writter.WriteLine("\tProperties:");
                            foreach (var property in column.ObjectType.Properties)
                            {
                                writter.WriteLine("\t\t" + property.Name + "\t\t" + property.DataType.FullName);
                            }
                            writter.WriteLine("\tMetadata:");
                            foreach (var metaData in column.ObjectType.Metadata)
                            {
                                writter.WriteLine("\t\t" + metaData.Name + "\t\t" + metaData.DataType.FullName);
                            }
                        }
                    }
                }
            }
        }
    }
}

Ich habe keine Ahnung, ob ich das richtig mache oder ob es einen viel besseren / einfacheren Weg gibt. Ich bin nicht sicher, wonach ich bei Google / S.E suchen soll. und kann keine Beispiele finden.

Ich sehe, dass die Variablenspalte ein nicht öffentliches Mitglied namens ContextObject hat, das eine Microsoft.Data.Tools.Schema.Sql.SchemaModel.SqlSimpleColumn ist. Wenn ich auf dieses Objekt zugreifen könnte, wäre ich in der Lage, alle benötigten Informationen daraus zu ziehen. Tabelle hat auch ein ähnliches ContextObject, das mir helfen würde.

Auf jeden Fall öffnet dies momentan den Dacpac und ruft alle Tabellen- und Spaltennamen ab. Ein Beispiel für die Daten, die ich erhalte, ist:

[dbo].[User]
    [dbo].[User].[UserID]
    Properties:
        Collation       System.String
        IsIdentityNotForReplication     System.Boolean
        Nullable        System.Boolean
        IsRowGuidCol        System.Boolean
        Sparse      System.Boolean
        Expression      Microsoft.Data.Tools.Schema.Sql.SchemaModel.SqlScriptProperty
        Persisted       System.Boolean
        PersistedNullable       System.Nullable`1[[System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]
        Scale       System.Int32
        Precision       System.Int32
        Length      System.Int32
        IsMax       System.Boolean
        XmlStyle        Microsoft.SqlServer.Dac.Model.XmlStyle
        IdentityIncrement       System.String
        IdentitySeed        System.String
        IsFileStream        System.Boolean
        IsIdentity      System.Boolean
    Metadata:
        ColumnType      Microsoft.SqlServer.Dac.Model.ColumnType

Grundsätzlich möchte ich eine der folgenden Aktionen ausführen:

Rufen Sie das ContextObject auf, um ein Microsoft.Data.Tools.Schema.Sql.SchemaModel. * -Objekt abzurufen. ODERRufen Sie den Wert der Eigenschaft und der Metadaten aus den ObjectType-Eigenschaften ab. ODERBeginnen Sie mit einer einfacheren Methode, um diese Informationen zu erhalten

Wir müssen Informationen wie den Spaltentyp, den Maßstab und die Genauigkeit einer Spalte herausfinden, falls er nullbar ist

Antworten auf die Frage(2)

Ihre Antwort auf die Frage