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 erhaltenWir müssen Informationen wie den Spaltentyp, den Maßstab und die Genauigkeit einer Spalte herausfinden, falls er nullbar ist