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 でその拡張プロパティを見つけることができます - 問題ありません - そこにあります。

しかし、ビューから にデータをロードすると、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接続は正常に機能し、クエリは正常に実行され、期待どおりに5行が返され、列が存在し、コレクションに値が取得されないことを除いて、すべて正常に見えます-.Count常に0です.

何か案は?これらの拡張プロパティを実際に取得するためにできることはありますか? 接続文字列パラメーターまたはプロパティ、SqlCommandまたは何かあいまいですか?

更新:Extended Properties SQL Server の列とExtended PropertiesADO.NETDataColumnの種類を持っている訓練を受けていない無知な人は、これらの SQL Server の拡張プロパティが ADO​​.NET の拡張プロパティに読み込まれることを示唆していますが、実際にはそうではないようですケース - うーん……。

ケビンが提案したように、2番目のクエリを使用することになりましたが、テーブルとビューの両方の拡張プロパティを取得する必要があり、関数を使用して探しているものを指定する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 サーバー バックエンドの列の拡張プロパティとは関係ありません。

別のクエリで拡張プロパティを取得する必要があるようです。

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 に答える