如何将动态SQL列读入C#?

3
我有一个SQL透视查询,其结果是动态的SQL列。我如何将这些值读入C#对象中?
虽然我能够从数据阅读器中读取值,但我并没有取得太大的成功。我无法将其打包到对象中。
我需要使用数据阅读器,并通过服务层向UI传递对象。
类似以下的SQL代码:
DECLARE @cols AS NVARCHAR(MAX),
@query  AS NVARCHAR(MAX)

SELECT @cols = STUFF((SELECT  ',' + QUOTENAME([MONTH]) 
                FROM #REVENUE
        FOR XML PATH(''), TYPE
        ).value('.', 'NVARCHAR(MAX)') 
    ,1,1,'')

SELECT @query = 
'SELECT * FROM
(SELECT     
 [MONTH], 
SALES
FROM #REVENUE)X
PIVOT 
(
  AVG(SALES)
  for [MONTH] in (' + @cols + ')
) P

EXEC SP_EXECUTESQL @query

1
你目前尝试了什么? - Musakkhir Sayyed
结果集中的所有列都有名称吗?如果您使用像 COUNT(*) 这样的函数或可能使用了数据透视表,那么这些列可能没有名称。请确保所有列都有一个与您代码期望的名称匹配的名称。 - Turophile
能够读取数据但无法继续。由于它是动态的,我在实体创建方面遇到了困难。 - iceman
请查看此链接:https://dev59.com/MlwZ5IYBdhLWcg3wQ-fl - J-D
无法创建对象,因为列是动态的。列可以是MAR,APR,MAY,JUN,JUL,AUG或者JUN,JUL,AUG,SEP,OCT,NOV。 - iceman
显示剩余5条评论
1个回答

2
如果你选择进入一个 SQLDataReader,它会有一个 GetName 属性,该属性将返回列名。类似于:
    using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(yourQuery, yourConnection)) {

        using (IDataReader reader = cmd.ExecuteReader) {
            for (int i = 0; i <= reader.FieldCount; i++) {
                var name = reader.GetName(i);
            }
        }
}

但是对象/实体呢? - iceman
我会建议使用一个键/值存储包装对象 - 我知道的另一种方法(但我自己没有尝试过)是ExpandoObject - https://msdn.microsoft.com/en-us/library/system.dynamic.expandoobject%28v=vs.100%29.aspx,但它似乎比它值得的麻烦多了。 - Allan S. Hansen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接