Грабване на разширени свойства от SQL Server в DataTable

Имам изглед, наречен PersonOverview, който има куп колони; това е напълно нормална гледка, нищо особено в нея.

Добавих разширено свойство, наречено FlexGridHide със стойност 1 към колоната DatenbereichCD на този изглед, използвайки.

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 или нещо неясно?

Актуализация: за нетренираните невежи, наличието на Extended Properties в колоните на SQL Server и Extended Properties в типа ADO.NET DataColumn подсказа, че тези разширени свойства на 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

person marc_s    schedule 04.07.2012    source източник
comment
Знам, че това не е оптимално, но обмисляли ли сте да използвате функцията на таблицата fn_listextendedproperty?   -  person Lamak    schedule 04.07.2012
comment
@AaronBertrand: искате ли да публикувате това като проблем за Connect към Microsoft? Изглежда те слушат - много повече, отколкото мен :-)   -  person marc_s    schedule 04.07.2012


Отговори (1)


Според тази публикация Разширените свойства на SQL Server и разширените свойства на ADO.NET не са свързани:

dataColumn.ExtendedProperties не е свързано с разширеното свойство на колона в бекенда на SQL сървъра.

Изглежда, че ще трябва да прибегнете до извличане на разширените свойства в отделна заявка.

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"]));
}
person Kevin Aenmey    schedule 04.07.2012
comment
Да, изглежда, че - срещу Принципа на най-малката изненада - тези две неща наистина не са напълно свързани.... хммм.... като Extended Property на колоните на SQL Server и Extended Property на ADO.NET DataColumn би накарал някои невежи като мен да предположат, че това е едно и също нещо.... не е така - за съжаление! - person marc_s; 04.07.2012
comment
Благодаря за вашия принос - накрая тръгнах по малко по-различен път (вижте моята актуализация на моя въпрос) - person marc_s; 04.07.2012
comment
Чувам те. Кой би предположил, че разширените свойства всъщност не са разширени свойства??? Както и да е, радвам се, че намерихте решение, което работи за вас. - person Kevin Aenmey; 04.07.2012
comment
И тук си помислих, че разширените свойства ще ми позволят автоматично да доставя персонализирани метаданни заедно с резултатите от заявката... въздишка. Разширени свойства на SQL: почти толкова полезни, колкото циците на бик. - person Brain2000; 05.09.2018