12

新しい SQL 2012 データベースを参照できるように、dbproj を sqlproj にアップグレードしようとしています。現在、.dbschema xml ファイルを読み取ってすべてのテーブルと列を検索し、それらから情報を取得するプログラムがあります。このデータを使用して、独自のカスタム クラスを構築します。

新しい sqlproj ファイルは、必要なデータを取得するために問い合わせたい dacpac を生成します。dacpac をトラバースして必要な情報を取得するために、次のように記述しました。

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);
                            }
                        }
                    }
                }
            }
        }
    }
}

これを正しい方法で行っているのか、それとももっと良い/簡単な方法があるのか​​ わかりません。Google/SE で何を検索したらよいかわからず、例も見つかりません。

変数列には、Microsoft.Data.Tools.Schema.Sql.SchemaModel.SqlSimpleColumn である ContextObject という非パブリック メンバーがあることがわかります。このオブジェクトにアクセスできれば、そこから必要なすべての情報を引き出すことができます。テーブルには、私を助ける同様の ContextObject もあります。

とにかく、現在これはdacpacを開き、すべてのテーブルと列の名前を取得します。私が取得するデータの例は次のとおりです。

[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

基本的には、次のいずれかを行いたいと考えています。

  1. ContextObject にアクセスして、Microsoft.Data.Tools.Schema.Sql.SchemaModel.* オブジェクトを取得する OR
  2. ObjectType プロパティからプロパティとメタデータの値を取得する OR
  3. この情報を簡単に取得する方法を使用して、ゼロから始めます

列の型、null 可能かどうか、列のスケールと精度などの情報を取得する必要があります。

4

2 に答える 2

1

私たちが見つけた方法は、Linq を使用してオブジェクト型のプロパティを見つけ、GetPropertyメソッドを使用して値を取得することです。

bool isNullable = (bool)column.GetProperty(column.ObjectType.Properties.Where(p => p.Name == "Nullable").First());

これはまだ最良の選択肢とは思えないので、他の誰かがより良い答えを持っている場合は投稿してください.

于 2013-08-05T02:21:06.150 に答える