gpt4 book ai didi

c# - 如何遍历 dacpac

转载 作者:可可西里 更新时间:2023-11-01 08:28:10 25 4
gpt4 key购买 nike

我们希望将 dbproj 升级为 sqlproj,以便我们可以将其指向新的 SQL 2012 数据库。目前我们有一个程序可以读取 .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 上搜索什么并且找不到任何示例。

我可以看到变量列有一个名为 ContextObject 的非公共(public)成员,它是一个 Microsoft.Data.Tools.Schema.Sql.SchemaModel.SqlSimpleColumn。如果我可以访问这个对象,那么我就可以从中提取我需要的所有信息。表也​​有一个类似的 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.* 对象或者
  2. 从 ObjectType 属性中获取属性值和元数据或者
  3. 从头开始,以更简单的方式获取这些信息

我们需要获取信息,例如列类型、它是否可为空以及列的小数位数和精度

最佳答案

因此,您可以在查询模型时使用一组完全定义的元数据类。这比依赖 Linq 并需要测试每个属性的字符串名称要简单。参见 TableColumn类为例。我已经更新了您的示例,展示了如何使用它们:

// Query for UserDefined objects to just filter to your own objects. All will
// include system objects (references to objects in master.dacpac if you reference that
// and BuiltIn objects such as the data types. You probably don't care about those
var allTables = model.GetObjects(DacQueryScopes.UserDefined, Table.TypeClass);

foreach (var table in allTables)
{
writter.WriteLine(table.Name);
// Columns are referenced by tables, so GetReferenced can be used. The GetChildren can also be used
// but filtering by comparing "child.ObjectType == Column.TypeClass" would simplify your example
foreach (var column in table.GetReferenced(Table.Columns))
{
// Now you can use the Column metadata class's properties to query your Column object
bool isNullable = column.GetProperty<bool>(Column.Nullable);
SqlDataType sdt = column.GetReferenced(Column.DataType).First().GetProperty<SqlDataType>(DataType.SqlDataType);
}

关于c# - 如何遍历 dacpac,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17983499/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com