Захват расширенных свойств из 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 в типе DataColumn ADO.NET предполагало, что эти расширенные свойства 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
Да, кажется, что — вопреки принципу наименьшего удивления — эти две вещи на самом деле совершенно не связаны.... хммм.... наличие расширенного свойства в столбцах SQL Server и расширенного свойства в 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