Szukamy ulepszenia naszego dbproj do sqlproj, abyśmy mogli skierować go do nowej bazy danych SQL 2012. Mamy program, który wczytuje plik .dbschema xml, aby znaleźć wszystkie tabele i kolumny oraz pobrać z nich informacje. Używamy tych danych do tworzenia własnych niestandardowych klas.Jak przejść przez dacpac
Nowy plik sqlproj produkuje teraz dacpac, który chcemy przeportować, aby uzyskać potrzebne dane. Pisałem następujące spróbować i przemierzać dacpac i uzyskać informację, że muszę:
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);
}
}
}
}
}
}
}
}
nie mam pojęcia, czy robię to we właściwy sposób, lub jeśli jest to znacznie lepszy/łatwiejszy sposób . Nie jestem pewien, czego szukać w Google/S.E. i nie można znaleźć żadnych przykładów.
Widzę, że kolumna zmiennej ma niepubliczny element członkowski o nazwie ContextObject, który jest Microsoft.Data.Tools.Schema.Sql.SchemaModel.SqlSimpleColumn. Gdybym mógł uzyskać dostęp do tego obiektu, byłbym w stanie wyciągnąć wszystkie potrzebne informacje. Tabela ma również podobny obiekt ContextObject, który mógłby mi pomóc.
W każdym razie, obecnie to otwiera dacpac i pobiera wszystkie nazwy tabel i kolumn. Przykładem danych pojawia się:
[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
Zasadniczo chciałbym wykonać jedną z następujących czynności:
- dostęp do ContextObject uzyskania Microsoft.Data.Tools.Schema.Sql .SchemaModel. * obiekt LUB
- Pobierz wartość nieruchomości i metadanych z właściwości objectType LUB
- zaczynać od zera z łatwiejszy sposób, aby uzyskać te informacje się
Musimy uzyskać informacje na zewnątrz, takich jak typ kolumny, howif To pustych, a skala i precyzja kolumny
Jest to bardzo pomocne. Niestety dla mnie ta sama obsługa nie wydaje się istnieć na zdefiniowanych przez użytkownika typach tabel. na przykład model.GetObjects (DacQueryScopes.UserDefined, ModelSchema.TableType); Próba uzyskania SqlDataType nie działa dla nich, ponieważ DataType nie jest obsługiwany na typ "TableTypeColumn". Założę się, że typy tabel definiowane przez użytkownika dziedziczą po prostu od zwykłego TableType. – Davos
Witaj Davos, traktujemy klasy metadanych Tabela i TableType jako całkowicie oddzielne, więc musisz użyć innego zapytania dla TableType. Powinieneś być w stanie użyć GetReferenced (TableTypeColumn.DataType), aby znaleźć typ danych.Jak zauważyłeś, nie ma dziedziczenia między tymi dwoma typami - cały stos relacji od Table-> Column i TableType-> TableTypeColumn jest inny. –
Dziękuję jeszcze raz, myślę, że mam go teraz :) \t \t List> tvpcols = tvp.GetReferenced() \t \t \t \t \t \t \t \t \t \t \t .gdzie (c = > c.ObjectType.Name == "TableTypeColumn") \t \t \t \t \t \t \t \t \t \t \t .Select (C => Tuple.Cre metylu (c.Name.Parts.Last(), c.GetReferenced (TableTypeColumn.DataType) .Last(). GetProperty (DataType.SqlDataType) .ToString())) \t \t \t \t \t \t \t \t \t \t \t \t \t \t .ToList(); –
Davos