2

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

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

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 中找到该扩展属性——没问题——它就在那里。

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

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连接工作得很好,查询执行得很好,按预期返回五行,列存在,一切似乎都很好——除了我在集合中没有得到任何值——.Count总是 0。

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

更新:对于未经训练的无知者,Extended Properties在 SQL Server 列和Extended PropertiesADO.NETDataColumn类型上建议将那些 SQL Server 扩展属性加载到 ADO.NET 扩展属性中——但这似乎不是案例 - 嗯……

正如 Kevin 建议的那样,我最终使用了第二个查询 - 但由于我需要获取表和视图的扩展属性,并且您必须使用该函数指定要查找的内容fn_listextendedproperty,因此我选择查询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
4

1 回答 1

3

根据这篇文章SQL Server 扩展属性和 ADO.NET 扩展属性不相关:

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

看来您将需要求助于在单独的查询中检索扩展属性。

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"]));
}
于 2012-07-04T15:20:08.477 回答