2012-07-04 58 views
1

我有一个视图叫PersonOverview,它有一堆列;这是一个完全正常的观点,没有什么特别的。从SQL Server获取扩展属性到DataTable中

我在该视图的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集合中没有得到任何值 - .Count总是0.

任何想法?有什么我可以做的,实际上得到那些扩展属性?连接字符串参数或SqlCommand上的某个属性或某个模糊的内容?

更新:未经训练的无知,其在ADO.NET DataColumnExtended Properties上的SQL Server列,Extended Properties排序表明,这些SQL Server扩展属性将被加载到ADO.NET扩展性 - 但这似乎并不是真的 - 嗯......

我结束了使用第二个查询,因为凯文建议 - 但因为我需要获得扩展属性的表和视图,你有到指定您使用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 
+0

我知道这不是最佳的,但你有没有考虑过使用fn_listextendedproperty表函数? – Lamak

+0

@AaronBertrand:谨慎发布这是一个“连接”问题给微软?他们似乎听取了你的意见 - 对我来说远不止这些:-) –

回答

2

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

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

看来您需要求助于检索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"])); 
} 
+0

是的,它似乎是 - 反对*最不惊讶的原则* - 这两个“事物”真的完全没有关系......嗯...... 。在SQL Server列上具有“扩展属性”,在ADO.NET DataColumn上具有“扩展属性”会导致像我这样的一些无知者**认为**基本上是同一件事情......但并非如此! –

+0

感谢您的输入 - 最后我做了一个稍微不同的路线(请参阅我的问题更新) –

+1

我听到你的声音。谁会猜测“扩展属性”实际上不是“扩展属性”?无论如何,我很高兴你找到了适合你的解决方案。 –