我正在研究在MVC中编写Web应用程序,我从中检索SQL数据。我需要在页面上显示这些数据,这是令人讨厌的部分,我可能不会知道所有返回的列。
通常情况下,我会有一个类,它将构成我Model
的一部分,允许我明确说明每个列的内容,并且它可以正常工作。
我看过动态表格,但即使它们似乎需要某些已知数量的列(我可能看错了)。
有人能指出我如何解决这个问题吗?我一直在想着如何编写这段代码,但我完全陷入困境。
- 的修改 SQL dev和我思考过的一件事是一个辅助存储过程,它会返回一个列标题列表,如果要使用它们,可能会返回true / false状态。对我来说,这似乎非常混乱。
答案 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;
}
}