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

时间:2014-01-07 11:54:54

标签: c# asp.net-mvc

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

通常情况下,我会有一个类,它将构成我Model的一部分,允许我明确说明每个列的内容,并且它可以正常工作。

我看过动态表格,但即使它们似乎需要某些已知数量的列(我可能看错了)。

有人能指出我如何解决这个问题吗?我一直在想着如何编写这段代码,但我完全陷入困境。

- 的修改 SQL dev和我思考过的一件事是一个辅助存储过程,它会返回一个列标题列表,如果要使用它们,可能会返回true / false状态。对我来说,这似乎非常混乱。

3 个答案:

答案 0 :(得分:0)

目前,您有一个动态写入行的循环。现在,你需要另一个循环来写列。数据对象(如datareader和datatables)通常具有计算列的属性,然后进行迭代。我无法提供编码示例,因为它取决于您正在使用的数据库对象。

答案 1 :(得分:0)

我自己想出来了。

当我从SQL获取数据时,我按预期迭代列表

var schemaTable = reader.GetSchemaTable();
List<string> columns = null;
if (schemaTable != null)
columns = schemaTable
.Rows.Cast<DataRow>()
.Select(r => (string) r["ColumnName"])
.ToList();

虽然这不是最好的方法,因为我必须隐藏某些列,然后调用一个单独的实用程序方法来验证是否要使用每个列。我已经存储在单独的SQL表中的显示/隐藏的列表。

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

在我的视图中,我按照正常方式遍历主列表,但每行都会遍历自定义列列表,检查它是否可见,并根据该信息创建每个列。

答案 2 :(得分:0)

这是我能够在不知道列名,订单等的情况下检索SQL表的最佳方式。

当您添加更多列时,表格会“展开”,因此您无需调整更改。

  

它不依赖于DataTable,它体积大而且速度慢。

至少需要:C#4.0

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;
    }
}