将扩展属性从SQL Server迁移到DataTable

时间:2012-07-04 14:48:18

标签: sql-server-2008 ado.net extended-properties

我有一个叫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上的属性或隐藏的内容?

更新:指向未经训练的无知者,SQL Server列上有Extended Properties,而ADO.NET Extended Properties类型上的DataColumn表示那些SQL Server扩展属性将被加载到ADO.NET扩展属性中 - 但实际上似乎并非如此 - 啊...... [/ p>

我最后使用了第二个查询,正如Kevin建议的那样 - 但是因为我需要为表和视图获取扩展属性,所以你必须使用{{指定你要查找的内容1}} function,我选择查询fn_listextendedproperty系统目录视图以获取我需要的信息。这是我的查询,我用来从SQL Server获取有关扩展属性的信息:

sys.extended_properties

1 个答案:

答案 0 :(得分:3)

根据this post,SQL Server扩展属性与ADO.NET扩展属性无关:

  

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

您似乎需要求助于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"]));
}