C# 在不知道列数的情况下在表中显示数据

C# 在不知道列数的情况下在表中显示数据,c#,asp.net-mvc,C#,Asp.net Mvc,我正在用MVC编写一个web应用程序,从SQL中检索数据。但是,我需要在页面上显示这些数据,这是令人讨厌的部分,我可能不知道返回的所有列 通常情况下,我会有一个类,该类将构成我的模型的一部分,允许我具体说明每个列是什么,并且它可以正常工作 我看过动态表,但即使它们似乎也需要某种已知的列数量,我可能看错了 有谁能给我指出正确的方向,告诉我怎么做?我一直在绞尽脑汁想如何写这段代码,但我完全被卡住了 - 编辑 SQL开发人员和我考虑过的一件事是一个辅助存储过程,它将返回列标题的列表,如果要使用,可能会

我正在用MVC编写一个web应用程序,从SQL中检索数据。但是,我需要在页面上显示这些数据,这是令人讨厌的部分,我可能不知道返回的所有列

通常情况下,我会有一个类,该类将构成我的模型的一部分,允许我具体说明每个列是什么,并且它可以正常工作

我看过动态表,但即使它们似乎也需要某种已知的列数量,我可能看错了

有谁能给我指出正确的方向,告诉我怎么做?我一直在绞尽脑汁想如何写这段代码,但我完全被卡住了

- 编辑
SQL开发人员和我考虑过的一件事是一个辅助存储过程,它将返回列标题的列表,如果要使用,可能会使用true/false来表示。但对我来说,这似乎非常混乱。

目前,您有一个用于动态逐行写入的循环。现在,您需要另一个内部循环来编写列。datareader和datatables之类的数据库对象通常有一个属性来计算列数并进行迭代。我不能提供编码示例,因为它取决于您使用的数据库对象。

我自己解决了这个问题

当我从SQL中获取数据时,我按预期遍历列表

var schemaTable = reader.GetSchemaTable();
List<string> columns = null;
if (schemaTable != null)
columns = schemaTable
.Rows.Cast<DataRow>()
.Select(r => (string) r["ColumnName"])
.ToList();
虽然这不是最好的方法,因为我必须隐藏某些列,然后调用单独的实用程序方法来验证是否要使用每个列。要显示/隐藏的内容列表已存储在单独的SQL表中

实用程序方法创建一个自定义列对象,其中包含列标题、值以及它是否可见。然后将其作为列表添加到我知道要显示的标准数据中


在我看来,然后我会像平常一样遍历我的主列表,但对于每一行,我会遍历自定义列列表,检查它是否可见,并根据这些信息创建每一列。

这是我能够在不知道列名、顺序等的情况下检索SQL表的最佳方法

当您添加更多列时,表将“展开”,这样您就不必调整更改

它不依赖于数据表的庞大和缓慢

至少需要:C 4.0


您的数据是如何表示的?自定义类、数据表或其他东西?您尝试了什么?发布代码。@AjayPunekar没有代码。正如我所说,我一直在努力思考如何写这篇文章。我的代码是用于DB调用的,我知道返回的是什么,所以在这个场景中没有多大用处@马修,现在开门。对于其他项目,我使用了自定义类,但我知道它们是什么。因此,目前这只是一个SP调用,之后我对SqlDataReader所做的工作有待讨论。
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;

public static class Validation
{
    public static List<dynamic> GetTable()
    {
        string _sql = "Select * from MyTable"
        List<dynamic> table = null;

        try
        {
            using (SqlConnection _conn = new SqlConnection(HelperData._conn_string))
            {
                _conn.Open();

                using (SqlCommand _cmd = new SqlCommand(_sql, _conn))
                {
                    _cmd.CommandTimeout = 600;

                    using (SqlDataReader reader = _cmd.ExecuteReader())
                    {
                        table = new List<dynamic>();

                        while (reader.Read())
                        {
                            var row = new System.Dynamic.ExpandoObject() as IDictionary<string, Object>;

                            for (int field = 0; field <= reader.FieldCount - 1; field++)
                            {
                                row.Add(reader.GetName(field), reader[field]);
                            }
                            table.Add(row);
                        }
                    }
                }
            }
        }
        catch (Exception ex) { throw ex; }
        return table;
    }
}