【问题标题】:Grabbing extended properties from SQL Server into DataTable将扩展属性从 SQL Server 抓取到 DataTable
【发布时间】:2012-07-05 02:10:21
【问题描述】:

我有一个名为PersonOverview 的视图,它有一堆列;这是一个完全正常的视图,没什么特别的。

我使用该视图的DatenbereichCD 列添加了一个名为FlexGridHide 的扩展属性,其值为1

EXEC sys.sp_addextendedproperty 
        @name = N'FlexGridHide', 
        @value = N'1', 
        @level0type = N'SCHEMA', @level0name = dbo, 
        @level1type = N'VIEW',  @level1name = vPersonOverview,
        @level2type = N'COLUMN', @level2name = DatenbereichCD;

我可以在 SQL Server 中找到该扩展属性 - 没问题 - 它就在那里。

但是当我将视图中的数据加载到DataTable 中时,我显然无法真正读出该扩展属性:

string sqlSelect = @"SELECT TOP 5 DatenbereichCD FROM dbo.vPersonOverview";

DataTable personUebersicht = new DataTable();

using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["MYDB"].ConnectionString))
using (SqlCommand cmd = new SqlCommand(sqlSelect, con))
using (SqlDataAdapter dap = new SqlDataAdapter(cmd))
{
   dap.Fill(personUebersicht);
}

DataColumn datenbereichCD = personUebersicht.Columns["DatenbereichCD"];    
int extendedProps = datenbereichCD.ExtendedProperties.Count;

连接工作得很好,查询执行得很好,按预期返回五行,列存在,一切似乎都很好 - 除了我在ExtendedProperties 集合中没有任何值 - @987654329 @ 始终为 0。

有什么想法吗?我能做些什么来真正获取这些扩展属性吗?连接字符串参数或SqlCommand 上的属性或什么晦涩难懂的东西?

更新:对于未经训练的无知者,在 SQL Server 列上具有 Extended Properties,在 ADO.NET DataColumn 类型上具有 Extended Properties,这表明这些 SQL Server 扩展属性将是加载到 ADO.NET 扩展属性中 - 但事实似乎并非如此 - 嗯.....

正如 Kevin 建议的那样,我最终使用了第二个查询 - 但由于我需要获取表和视图的扩展属性,并且您必须使用 @987654334指定您要查找的内容@ 函数,我选择查询 sys.extended_properties 系统目录视图以获取我需要的信息。这是我用来从 SQL Server 获取有关扩展属性的信息的查询:

SELECT 
    ep.class, ep.class_desc, ep.name, ep.value,
    SchemaName = s.name,
    ObjectName = o.name,
    ColumnName = c.Name,
    ObjectType = o.type, 
    ObjectTypeDesc = o.type_desc
FROM sys.extended_properties ep
INNER JOIN sys.objects o ON ep.major_id = o.object_id
INNER JOIN sys.schemas s ON o.schema_id = s.schema_id
INNER JOIN sys.columns c ON ep.major_id = c.object_id AND ep.minor_id = c.column_id

【问题讨论】:

  • 我知道这不是最优的,但是您是否考虑过使用 fn_listextendedproperty 表函数?
  • @AaronBertrand:愿意将此作为“连接”问题发布给 Microsoft 吗?他们似乎听你的 - 反正比我听的多:-)

标签: sql-server-2008 ado.net extended-properties


【解决方案1】:

根据this post,SQL Server 扩展属性和 ADO.NET 扩展属性不相关:

dataColumn.ExtendedProperties 与 SQL Server 后端列的扩展属性无关。

看来您需要在separate query 中检索扩展属性。

DataTable personUebersicht = new DataTable();
DataTable extendedProperties = new DataTable();

using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["MYDB"].ConnectionString))
{
    string sqlSelect = @"SELECT TOP 5 DatenbereichCD FROM dbo.vPersonOverview";
    using (SqlCommand cmd = new SqlCommand(sqlSelect, con))
    using (SqlDataAdapter dap = new SqlDataAdapter(cmd))
    {
        dap.Fill(personUebersicht);
    }

    string sqlProperties = @"SELECT name, value FROM ::fn_listextendedproperty(null,'user','dbo','view','vPersonOverview','column','DatenbereichCD')";
    using (SqlCommand cmd = new SqlCommand(sqlProperties, con))
    using (SqlDataAdapter dap = new SqlDataAdapter(cmd))
    {
        dap.Fill(extendedProperties);
    }
}

// Test the results
foreach (DataRow row in extendedProperties.Rows)
{
    Console.WriteLine(string.Format("{0}: {1}", row["name"], row["value"]));
}

【讨论】:

  • 是的,似乎 - 违反 最少意外原则 - 这两个“事物”真的完全不相关......嗯...... SQL Server 列上的“属性”和 ADO.NET DataColumn 上的“扩展属性”会导致像我这样的一些无知者假设这基本上是同一件事......不是这样 - 不幸的是!
  • 感谢您的意见 - 最后我走了一条略有不同的路线(请参阅我对问题的更新)
  • 我听到了。谁会猜到“扩展属性”实际上不是“扩展属性”???无论如何,我很高兴您找到了适合您的解决方案。
  • 在这里我认为扩展属性将允许我自动提供自定义元数据以及查询结果......叹息。 SQL 扩展属性:与公牛上的山雀一样有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-06
  • 1970-01-01
  • 2017-12-27
  • 2011-08-04
  • 1970-01-01
相关资源
最近更新 更多