请考虑以下情况。
你有一个存储过程返回多个结果集 查询运行以用于报告目的。
proc也使用表值参数(SQL 2008)。 http://www.sommarskog.se/arrays-in-sql-2008.html#LINQ_EF
这些结果集是只读的,这意味着您不必这样做 担心更新,删除或插入。
这些结果集不会映射到数据库中的任何表; 这些是报告结果,而不是数据库表的镜像。
现在,我的背景是asp经典,而我一直在尝试阅读 在所有.NET数据访问策略中,似乎: (1)MS正在推动实体框架 (2)MS拥有大量的数据访问/架构策略 (3)整个主题是一个持续争论的主题 (4)项目的情况有助于规定正确的数据访问策略, 并且ORM似乎没有针对此数据访问方案进行优化 (5)没有用于映射多个结果集存储过程的开箱即用解决方案
另外,我正在寻找对html输出的完全控制,所以如果使用后面的代码, 只有Repeater和Literals才会用于数据绑定。
我发现Web窗体编程模型无法实现完全分离 代码和内容,可以像asp经典一样“意大利面”。 (MVC 方法似乎更像asp经典,但这个项目已经是WebForms。)
我认为通过数据访问和内联脚本实现这很容易实现< %%>在同一页上。 以下是将产生的代码类型的示例:
<%
' data access (skipping a bunch of code)....
Dim myDataSet As New DataSet()
myCommand.Fill(myDataSet)
'...etc.
Teachers = myDataSet.Tables(0).Rows
Students = myDataSet.Tables(1).Rows
'... etc.%>
然后
<% If Teachers.Count > 0 Then%>
<table><% For Each _Teachers In Teachers%>
<tr>
<td><%= _Teachers(0)%></td>
<td><%= _Teachers(1)%></td>
</tr><% Next %>
</table>
<% Else%>Hey, there's no records.<% End If %>
(当我尝试在“Protected Sub Page_Load ...”下面的代码中分离数据访问时, 我在.aspx页面中使用的代码中的变量不断给出错误: “[变量]未声明。由于其保护级别,它可能无法访问。”)
如果来自proc的结果集没有强类型, 它是世界末日,糟糕的编程实践,可维护性的噩梦, 最糟糕的选择等等?
如果存储过程的结果集应该是强类型的, 那么最有效的方法是什么? (我不是 找到关于这个主题的直接教程。)
提前感谢您的帮助。
答案 0 :(得分:0)
听起来您在询问是否应该继续为数据使用ADO.NET容器或自定义域类。
如果您觉得在显示之前需要强类型类,输入验证或其他逻辑应用于您的数据,那么请考虑编写一个方法将DataTable转换为YourClass的集合。否则,如果这是显示,那么坚持使用DataTable没有任何问题。如果您为其他组件提供界面,或者需要类可以提供的功能,请选择类的强类型。
public IEnumerable<Teacher> ConvertToTeachers(DataTable dt)
{
foreach (var row in dt.Rows.AsEnumerable())
{
//create a teacher from this row. modify row indexers as required.
yield return new Teacher{ TeacherName = row["Name"].Value,
Location = row["Location"].Value };
}
}
在表示层上,请考虑利用ASP.NET webforms为您提供的服务器控件。它们提供了数据绑定功能,可以消除所有循环。
确保您的gridview按照您的喜好进行设计。包含所需数据的正确列:常规绑定字段和超链接。
将您的数据绑定到网格。
gridViewTeachers.DataSource = myDataSet.Tables(0).Rows
gridViewTeachers.DataBind